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

sin*_*inθ 2 haskell

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,但上面的代码是我的头脑.任何文档/或演练将非常感谢!

cch*_*ers 7

首先把FixedList f =>强制执行的约束fFixedList使用构造函数时.我不确定为什么在这里使用它.通常建议不要这样做.

在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)