【发布时间】:2020-02-12 10:05:00
【问题描述】:
我目前正在通过 Learn You a Haskell for Great Good 一书学习 Haskell,并被 Log Number 和 Greatest Common Divisor 的脚本困住了。 em> 介绍Writer monad。我了解它们的作用,但将它们加载到 ghci 会导致错误。见:http://learnyouahaskell.com/for-a-few-monads-more#writer
下面是logNumber 脚本和我得到的错误代码:
-- Log Number
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber x = Writer (x, ["Got number: " ++ show x])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a*b)
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])
| ^^^^^^
我不知道为什么会这样,因为我从示例中复制了代码。代码有问题吗?或者自从本书出版以来,Control.Monad.Writer 图书馆是否发生了变化?如何修复代码?
我正在使用 haskell-platform 和 ghc 8.6.5。
【问题讨论】:
-
实际构造函数是
WriterT (m (a, w))。可能是因为书的版本没有更新。只需替换logNumber x = return (x, ["Got number: " ++ show x])` -
@Ismor 或者您可以使用
writer函数,正如我在回答中提到的那样。