以下代码是LYAH的逐字编译,无法编译.代码和编译时错误包括在下面.在LYAH页面上,代码在页面下方约15%,yay emacs浏览器:)
有什么想法吗?我忽略了一些完全明显的东西吗
(尽管后期标题相似,但我认为我的问题与此不同.)
这是代码(在我命名的文件中testcopy.hs)
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)
Run Code Online (Sandbox Code Playgroud)
这是编译时错误:
Prelude> :l testcopy.hs
[1 of 1] Compiling Main ( testcopy.hs, interpreted )
testcopy.hs:4:15:
Not in scope: data constructor `Writer'
Perhaps you meant `WriterT' (imported from Control.Monad.Writer)
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 17
LYAH在这个例子中已经过时了.您应该使用writer智能构造函数方法而不是(现在不存在的)Writer数据构造函数.
为了扩展一点,这些数据类型被更新为与monad变换器更兼容.其结果是,有一个一般的WriterT,用于在单子变压器堆使用,以及Writer对构成类型同义词WriterT用Identity.因此,不再存在与该Writer类型特定关联的数据构造函数(因为Writer它是类型同义词).
幸运的是,尽管有这种复杂性,但解决方案非常简单:替换Writer为writer.