資料型別系列

資料系列可用於構建基於其型別引數具有不同實現的資料型別。

獨立資料系列

{-# LANGUAGE TypeFamilies #-}
data family List a
data instance List Char = Nil | Cons Char (List Char)
data instance List () = UnitList Int

在上面的宣告中,Nil::List CharUnitList::Int -> List ()

相關資料系列

資料系列也可以與型別類相關聯。這對於具有輔助物件的型別通常很有用,這些型別是通用型別類方法所必需的,但需要根據具體例項包含不同的資訊。例如,索引列表中的位置只需要一個數字,而在樹中,你需要一個數字來指示每個節點的路徑:

class Container f where
  data Location f
  get::Location f -> f a -> Maybe a

instance Container [] where
  data Location [] = ListLoc Int
  get (ListLoc i) xs
    | i < length xs  = Just $ xs!!i
    | otherwise      = Nothing

instance Container Tree where
  data Location Tree = ThisNode | NodePath Int (Location Tree)
  get ThisNode (Node x _) = Just x
  get (NodePath i path) (Node _ sfo) = get path =<< get i sfo