数据类型系列
数据系列可用于构建基于其类型参数具有不同实现的数据类型。
独立数据系列
{-# 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