Проблемы с использованием монады Writer в ghci - PullRequest
3 голосов
/ 12 февраля 2020

Я в настоящее время изучаю Haskell с книгой Learn You a Haskell для Great Good и застрял со сценариями для Log Number и Greatest Common Divisor введение монады Writer. Я понимаю, что они делают, но загрузка их в 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.

1 Ответ

7 голосов
/ 12 февраля 2020

Изменилась ли библиотека Control.Monad.Writer с момента публикации книги?

Да, это проблема. С момента публикации LYAH монада Writer была изменена; вместо того, чтобы быть его собственным типом данных, он теперь определяется в терминах монадного преобразователя WriterT. Монадные преобразователи действительно полезны, и это изменение дало гораздо большую гибкость, но это также означало, что все старые уроки больше не верны. Вы можете обойти это, используя функцию writer вместо конструктора Writer: они имеют один и тот же тип, но writer реализован в терминах нового типа WriterT вместо теперь удаленного Writer конструктор.

...