資料型別系列
資料系列可用於構建基於其型別引數具有不同實現的資料型別。
獨立資料系列
{-# LANGUAGE TypeFamilies #-}
data family List a
data instance List Char = Nil | Cons Char (List Char)
data instance List () = UnitList Int
在上面的宣告中,Nil::List Char
和 UnitList::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