我一直在尝试编译Haskell代码 - 再次 - 涉及Control.Monad.Writer.这是一个不能从Learn You a Haskell编译的代码示例:
import Control.Monad.Writer
gcd' :: Int -> Int -> Writer [String] Int
gcd' a b
| b == 0 = do
tell ["Finished with " ++ show a]
return a
| otherwise = do
tell [show a ++ " mod " ++ show b ++ " = " ++ show (a `mod` b)]
gcd' b (a `mod` b)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
No instance for (Show (Writer [String] Int))
arising from a use of `print'
Possible fix:
add an instance declaration for (Show (Writer [String] Int))
In a stmt of an interactive GHCi command: print it
Run Code Online (Sandbox Code Playgroud)
我已经尝试编译我的老师今天写的代码也涉及Control.Monad.Writer,但没有任何作用.
我使用的是Ubuntu 12.04,gedit和GHC 7.4.1.
来自Learn You a Haskell的所有Writer monad程序都无法编译,而且我很困惑.
你显然输入了类似的东西
ghci> gcd' 12345 6789
Run Code Online (Sandbox Code Playgroud)
在ghci提示.因此你要求ghci打印一个类型的值Writer [String] Int,但是没有类型的Show实例Writer,因此ghci无法打印它.你需要申请runWriter或类似的功能,
ghci> runWriter $ gcd' 12345 6789
Run Code Online (Sandbox Code Playgroud)
应该管用.