Как играть с управлением.Монада.Писатель в Хаскелле?



Я новичок в функциональном программировании и недавно учился в узнать вы на Haskell, но когда я прошел эта глава, Я застрял с программой ниже:



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)


Я сохранил эти строки в a .hs-файл, но не удалось импортировать его в мой ghci, который жаловался:



more1.hs:4:15:
Not in scope: data constructor `Writer'
Perhaps you meant `WriterT' (imported from Control.Monad.Writer)
Failed, modules loaded: none.


Я проверил тип с помощью команды": info":



Prelude Control.Monad.Writer> :info Writer
type Writer w = WriterT w Data.Functor.Identity.Identity
-- Defined in `Control.Monad.Trans.Writer.Lazy'


С моей точки зрения, это должно было быть что-то вроде " newtype Writer w a ..."
поэтому я смущен тем, как кормить конструктор данных и получить писателя.



Я думаю, что это может быть проблема, связанная с версией, и моя версия ghci-7.4.1

576   3  

3 ответов:

пакета Control.Monad.Writer не экспортирует конструктор данных Writer. Я думаю, что это было по-другому, когда Лях был написан.

использование класса MonadWriter в ghci

вместо этого вы создаете писателей с помощью

функция под названием " writer "становится доступной вместо конструктора" Writer". Изменение:

logNumber x = Writer (x, ["Got number: " ++ show x])

to:

logNumber x = writer (x, ["Got number: " ++ show x])

я получил аналогичное сообщение от попытки LYAH "на несколько единиц больше" используя онлайн редактор Haskell в repl.it

Я изменил импорт из:

import Control.Monad.Writer

to:

import qualified Control.Monad.Trans.Writer.Lazy as W

Итак, мой код теперь работает так (с вдохновением от блог Хаскелла Квана):

import Data.Monoid
import qualified Control.Monad.Trans.Writer.Lazy as W


output :: String -> W.Writer [String] ()
output x = W.tell [x]


gcd' :: Int -> Int -> W.Writer [String] Int  
gcd' a b  
    | b == 0 = do  
        output ("Finished with " ++ show a)
        return a  
    | otherwise = do  
        output (show a ++ " mod " ++ show b ++ " = " ++ show (a `mod` b))
        gcd' b (a `mod` b)

main :: IO()
main = mapM_ putStrLn $ snd $ W.runWriter (gcd' 8 3) 

код в настоящее время работает здесь

Comments

    Ничего не найдено.