Как играть с управлением.Монада.Писатель в Хаскелле?
Я новичок в функциональном программировании и недавно учился в узнать вы на 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
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.Writerto:
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