繁体   English   中英

Haskell newtype语法

[英]Haskell newtype syntax

请帮我理解以下定义:

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只有记录

  1. 由于这种访问器代码非常常见,因此语法更加方便
  2. 功能更新的能力
  3. 其他一些扩展

例如

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

如果它有所帮助,可以将它想象成最粗糙的“功能性吸气剂”。 对于1字段,这可能看起来并不十分重要,您可以始终模式匹配,但是当您有5个字段时,记录+功能更新非常有用。 有关更深入的解释,请参阅LYAH

另一种看待它的方法:你可以想象定义2元组是这样的(如果特殊(,)语法不是一个特殊的内置)

data  (,)  a b   =   (,)  { fst :: a, snd :: b }

然后fstsnd会表现得正常:

fst :: (a,b) -> a
fst (x,y) = x

(在您的示例中, newtype适用于只有一个值字段的类型。对于具有多个字段的类型,需要data 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM