2013-07-05 143 views
1

我有困難,瞭解如何正確地實現(>> =)二叉樹的單子。我有以下二叉樹:二叉樹單子實施

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

這裏的(>> =)運算符爲我的單子:

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) 

所以我不瞭解我如何才能獲得正確類型的適當葉子?

任何幫助表示讚賞

感謝

回答

2

你的Node定義說,在構造函數中的第一個值具有 型a,但您正在嘗試到BinTree a插入節點值。 你需要做的是綁定的f x結果,並以此作爲對 新節點的值。

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

謝謝!我沒有想到對結果有約束力。 – charles

+0

IMO,在LHS的括號使其相當的可讀性。我寧願寫這個'Node x l r >> = f' \ n'= f x >> = ...'。 – leftaroundabout

+0

我實現了單子類型類相同的方式。它編譯得很好,但是,執行這個時總會以無限循環結束。 從我的角度來看,這是不可能實現的單子類型類爲這棵樹型。或者我錯了? – user4587483