【问题标题】:Problems using Writer monad in ghci在 ghci 中使用 Writer monad 的问题
【发布时间】:2020-02-12 10:05:00
【问题描述】:

我目前正在通过 Learn You a Haskell for Great Good 一书学习 Haskell,并被 Log NumberGreatest 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-platformghc 8.6.5

【问题讨论】:

  • 实际构造函数是WriterT (m (a, w))。可能是因为书的版本没有更新。只需替换logNumber x = return (x, ["Got number: " ++ show x]) `
  • @Ismor 或者您可以使用writer 函数,正如我在回答中提到的那样。

标签: haskell monads


【解决方案1】:

自本书出版以来,Control.Monad.Writer 图书馆是否发生了变化?

是的,这就是问题所在。自 LYAH 发布以来,Writer monad 已更改;现在,它不再是自己的数据类型,而是根据 monad 转换器 WriterT 定义。 Monad 转换器真的很有用,而且这个改变提供了更多的灵活性,但这也意味着所有的旧教程都不再正确。您可以通过使用writer 函数而不是Writer 构造函数来解决此问题:它们具有相同的类型,但writer 是根据新的WriterT 类型而不是现在删除的Writer 实现的构造函数。

【讨论】:

    猜你喜欢
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2011-12-24
    相关资源
    最近更新 更多