在Data.FixedList的源代码中,我找到了以下定义:
data FixedList f =>
Cons f a = (:.) {
head :: a,
tail :: (f a)
} deriving (Eq, Ord)
Run Code Online (Sandbox Code Playgroud)
作为Haskell的新手,很难弄清楚这里发生了什么.我理解语法,如data TypeName = TypeName { a :: Int, b :: Int} deriving (Show)或data TypeName = TypeA | TypeB,但上面的代码是我的头脑.任何文档/或演练将非常感谢!
首先把FixedList f =>强制执行的约束f是FixedList使用构造函数时.我不确定为什么在这里使用它.通常建议不要这样做.
在Haskell中,您可以使用符号开头的中缀数据构造函数:.在库中,构造函数放在括号中,(:.)因此可以与记录语法一起使用.没有记录语法,它看起来像这样:
data Cons f a = a :. f a
Run Code Online (Sandbox Code Playgroud)
模式匹配与列表非常相似.这是一个使用它的简单函数:
mapHead :: FixedList f => (a -> a) -> Cons f a -> Cons f a
mapHead f (a :. as) = f a :. as
Run Code Online (Sandbox Code Playgroud)
这是一个不使用中缀构造函数的定义.
data Cons f a = Cons
{ head :: a
, tail :: f a
}
Run Code Online (Sandbox Code Playgroud)