【问题标题】:What is `Cons` in Data.FixedList source code?Data.FixedList 源代码中的“缺点”是什么?
【发布时间】:2016-11-20 11:32:01
【问题描述】:

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 之类的语法,但上面的代码超出了我的想象。任何文档/或演练将不胜感激!

【问题讨论】:

    标签: haskell


    【解决方案1】:

    首先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
      }
    

    【讨论】:

      【解决方案2】:

      这主要是你以前见过的东西的花哨格式。

      data FixedList f => Cons f a = (:.) { head :: a
                                          , tail :: (f a)
                                          } deriving (Eq, Ord)
      

      FixedList f 只是Cons f a 数据类型的类型类约束。 (:.) 是一个中缀数据构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多