Data.FixedList源代码中的什么是“缺点”?

时间:2016-07-17 23:26:54

标签: haskell

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等语法,但上面的代码完全超出了我的想法。任何文件/或演练都将非常感谢!

2 个答案:

答案 0 :(得分:7)

首先,FixedList f =>在使用构造函数时强制执行fFixedList的约束。我不确定为什么在这里使用它。通常是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数据类型的类型类约束。 (:.)是中缀数据构造函数。