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 transformer
WriterT
定义的。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])
  |               ^^^^^^