在Data.FixedList的源代码中,我找到了以下定义:
data FixedList f =>
Cons f a = (:.) {
head :: a,
tail :: (f a)
} deriving (Eq, Ord)
作为Haskell的新手,很难弄清楚这里发生了什么。我理解data TypeName = TypeName { a :: Int, b :: Int} deriving (Show)
或data TypeName = TypeA | TypeB
等语法,但上面的代码完全超出了我的想法。任何文件/或演练都将非常感谢!
答案 0 :(得分:7)
首先,FixedList f =>
在使用构造函数时强制执行f
为FixedList
的约束。我不确定为什么在这里使用它。通常是advised against。
在Haskell中,您可以使用以:
开头的符号来创建中缀数据构造函数。在库中,构造函数放在括号(:.)
中,因此它可以与记录语法一起使用。如果没有记录语法,它将如下所示:
data Cons f a = a :. f a
模式匹配与列表非常相似。这是一个使用它的简单功能:
mapHead :: FixedList f => (a -> a) -> Cons f a -> Cons f a
mapHead f (a :. as) = f a :. as
这是一个不使用中缀构造函数的定义。
data Cons f a = Cons
{ head :: a
, tail :: f a
}
答案 1 :(得分:4)
这主要是你以前见过的事情的格式化。
data FixedList f => Cons f a = (:.) { head :: a
, tail :: (f a)
} deriving (Eq, Ord)
FixedList f
只是Cons f a
数据类型的类型类约束。 (:.)
是中缀数据构造函数。