Haskell 新类型语法

标签 haskell newtype

请帮助我理解以下定义:

newtype Writer w a = Writer { runWriter :: (a,w) } 

instance (Monoid w) => Monad (Writer w) where 
    return a             = Writer (a,mempty) 
    (Writer (a,w)) >>= f = let (a',w') = runWriter $ f a in Writer (a',w `mappend` w')

为什么 runWriter 被声明为
runWriter :: (a,w)

当它的实际类型是:
runWriter :: Writer w a -> (a, w)

一旦我尝试使用 ghci,我意识到这一定是一些隐含的论点,因为必须确定类型“a”,但这里到底发生了什么?

最佳答案

因为runWriterWriter 上的记录字段访问器.它实际上几乎等同于

runWriter (Writer x) = x

Haskell 有记录可以提供
  • 更方便的语法,因为这种访问器代码很常见
  • 功能更新的能力
  • 其他一些扩展

  • 例如
    someWriter{runWriter = (new, values)} -- Returns a new Writer.
    

    如果它有帮助,请将其视为最粗略意义上的“功能性 setter/getter ”。这对于 1 个字段可能看起来不是很重要,您始终可以进行模式匹配,但是当您有 5 个字段时,记录 + 功能更新非常有用。见 LYAH以获得更深入的解释。

    关于Haskell 新类型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17600168/

    相关文章:

    haskell - 无法安装 c2hs 和语言-c

    Haskell:如何将字符串转换为 bool 矩阵

    haskell - 使用基于整数 Haskell 的 newtypes 执行代数

    haskell - 枚举类型的自定义派生(读取、显示)

    haskell - 为 GADT 定义您自己的 Typeable 实例

    Haskell : Will GHC optimize this?

    haskell - 带有元组的新类型

    haskell - 在 Haskell 中创建许多类似的新类型/类型类实例

    vector - 如何将迭代器元素的类型强制转换为新类型?

    haskell - 构造延续类型?