数据类型系列

数据系列可用于构建基于其类型参数具有不同实现的数据类型。

独立数据系列

{-# 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