Haskell ghci中使用Writer monad的问题
我目前正在学习哈斯凯尔的书《学好哈斯凯尔》一书,书中介绍了Haskell ghci中使用Writer monad的问题,haskell,monads,Haskell,Monads,我目前正在学习哈斯凯尔的书《学好哈斯凯尔》一书,书中介绍了Writermonad,书中的日志号和最大公约数脚本让我陷入困境。我了解它们的功能,但在ghci中加载它们会导致错误。见: 下面是logNumber脚本和我得到的错误代码: ——日志号 导入控制.Monad.Writer logNumber::Int->Writer[String]Int logNumber x=Writer(x,[“获取编号:++显示x]) multWithLog::Writer[String]Int multWithL
Writer
monad,书中的日志号和最大公约数脚本让我陷入困境。我了解它们的功能,但在ghci
中加载它们会导致错误。见:
下面是logNumber
脚本和我得到的错误代码:
——日志号
导入控制.Monad.Writer
logNumber::Int->Writer[String]Int
logNumber x=Writer(x,[“获取编号:++显示x])
multWithLog::Writer[String]Int
multWithLog=do
A.
自本书出版以来,Control.Monad.Writer
库是否已更改
是的,这就是问题所在。自从LYAH出版以来,作者
单子已经改变;它不再是自己的数据类型,而是根据monad transformerWriterT
定义的。Monad transformers真的很有用,这一更改提供了更多的灵活性,但也意味着所有旧教程不再正确。您可以通过使用writer
函数而不是writer
构造函数来解决这个问题:它们具有相同的类型,但是writer
是根据新的writer
类型来实现的,而不是现在删除的writer
构造函数。实际的构造函数是writer(m(a,w))
。可能是因为这本书没有更新。只需替换logNumber x=return(x,[“Got number:++show x])
`@Ismor,或者您可以使用writer
函数,正如我在回答中提到的那样。
error:
* Data constructor not in scope:
Writer :: (Int, [[Char]]) -> Writer [String] Int
* Perhaps you meant one of these:
`WriterT' (imported from Control.Monad.Writer),
variable `writer' (imported from Control.Monad.Writer)
|
5 | logNumber x = Writer (x, ["Got number: " ++ show x])
| ^^^^^^