Writer monad运算符定义问题

时间:2014-12-11 16:30:10

标签: haskell

我想为Write monad定义>>=运算符。 我尝试了类似的东西,但它没有工作(不编译)。我可以得到一些帮助吗?感谢

newtype Writer a = Writer { runWriter :: (a, [String]) }

instance Monad Writer where
    return = Writer

    Writer m >>= f = Writer $ \r ->
        (runWriter (f m) r)

我明白了:

Couldn't match type ‘a’ with ‘(a, [String])’

我在返回行时收到此错误,但>>=定义不正确,我试图纠正错误。

2 个答案:

答案 0 :(得分:5)

首先:return的类型签名应为x -> Writer x。但是,Writer的类型签名目前为(x, [String]) -> Writer x,这是错误的。

第二:Writer m >>= f = Writer $ \r -> ...Writer的参数未声明具有函数类型。所以这看起来不会起作用。此外,您使用f :: x -> Writer y类型的参数调用(x, [String]),这不起作用。

简而言之,整个事情本身就是不对的。这就是为什么它不会编译;不知道你有多少提示如何解决它。

答案 1 :(得分:2)

Writer构造函数需要一个a元组和已编写的元组。 return没有写任何内容

return a = Writer (a, [])