无法编译来自"了解你的Haskell"的Writer Monad示例

ice*_*man 10 monads haskell

以下代码是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.

  • @DipakC保持类型签名相同.通过调用`writer`替换函数调用`Writer`.类型签名中的小写起始字母总是指类型变量,这不是我们想要的.我们想要具体的类型`Writer`. (11认同)