二叉树monad实现

时间:2013-07-05 17:34:23

标签: haskell binary-tree monads

我很难理解如何正确实现二元树monad的(>> =)。我有以下二叉树:

data BinTree a = Leaf a | Node a (BinTree a) (BinTree a) 
    deriving (Eq, Ord, Show, Read) 

这是我monad的(>> =)运算符:

Node x l r >>= f = Node (f x) (l >>= f) (r >>= f)
                 __________^

我一直收到这个错误:

Couldn't match type `b' with `BinTree b'
`b' is a rigid type variable bound by
  the type signature for
    >>= :: BinTree a -> (a -> BinTree b) -> BinTree b
  at test.hs:153:5
 In the return type of a call of `f'
 In the first argument of `Node', namely `(f x)'
 In the expression: Node (f x) (l >>= f) (r >>= f)

所以我不明白如何才能获得正确类型的正确叶子?

感谢任何帮助

由于

1 个答案:

答案 0 :(得分:2)

您对Node的定义表示构造函数中的第一个值 键入a,但您尝试在节点值中插入BinTree a。 您需要做的是绑定f x的结果并将其用作值 新节点。

(Node x l r) >>= f = f x >>= \y -> Node y (l >>= f) (r >>= f)