下面的代码,这是verbatim from LYAH,不编译编译作家单子例子。代码和编译时错误包含在下面。在LYAH页,代码〜15%下跌的一页,耶emacs的浏览器:)无法从“学习你Haskell的”
任何想法,为什么?我忽略了一些完全明显的东西?
(尽管在后头衔的相似性,我想我的问题是从this one不同。)
这里是(我命名为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)
而且这里是编译时错误:
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.
我想这是我乐观的认为,与'writer'更换'Writer'会得到它运行:)这样做的结果在'multWithLog'函数的下列错误中(以及'logNumber'函数的类似错误):'没有从do语句引起的(Monad(writer [String])的实例)。我会继续玩。 – iceman 2014-10-16 22:57:59
@DipakC保留类型签名相同。通过调用'writer'来替换函数调用'Writer'。类型签名中的小写起始字母总是指一个类型变量,这不是我们想要的。我们需要具体的类型'Writer'。 – 2014-10-16 22:59:28
我的意思是,谁不想要一台具体的打字机? – N3dst4 2017-10-10 12:01:53