4

我整天都在尝试编译 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)

我收到此错误:

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

我已经尝试编译我的老师今天编写的代码,也涉及 Control.Monad.Writer,但没有任何效果。

我正在使用 Ubuntu 12.04、gedit 和 GHC 7.4.1。

Learn You a Haskell中的所有 Writer monad 程序都无法编译,我被困住了。

4

1 回答 1

8

你显然输入了类似的东西

ghci> gcd' 12345 6789

在 ghci 提示符下。因此,您要求 ghci 打印 type 的值Writer [String] Int,但没有类型的Show实例Writer,因此 ghci 无法打印它。你需要申请runWriter或类似的功能,

ghci> runWriter $ gcd' 12345 6789

应该管用。

于 2012-06-26T22:21:11.887 回答