我想为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])’
我在返回行时收到此错误,但>>=
定义不正确,我试图纠正错误。
答案 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, [])