请帮我理解以下定义:
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')
Run Code Online (Sandbox Code Playgroud)
为什么runWriter被声明为
runWriter :: (a,w)
Run Code Online (Sandbox Code Playgroud)
当它的实际类型是:
runWriter :: Writer w a -> (a, w)
Run Code Online (Sandbox Code Playgroud)
一旦我尝试使用ghci,我意识到这必须是一些隐含的参数,因为必须确定类型"a",但这里究竟发生了什么?
因为runWriter
是一个记录字段访问器Writer
.它实际上几乎等同于
runWriter (Writer x) = x
Run Code Online (Sandbox Code Playgroud)
Haskell只有记录
例如
someWriter{runWriter = (new, values)} -- Returns a new Writer.
Run Code Online (Sandbox Code Playgroud)
如果它有所帮助,可以将它想象成最粗糙的"功能性吸气剂".对于1字段,这可能看起来并不十分重要,您可以始终模式匹配,但是当您有5个字段时,记录+功能更新非常有用.有关更深入的解释,请参阅LYAH.
归档时间: |
|
查看次数: |
877 次 |
最近记录: |