2013-07-05 7 views
1

이진 트리의 모나드에 대해 (>> =)을 올바르게 구현하는 방법을 이해하는 데 어려움이 있습니다. 나는 다음과 같은 이진 트리가 :이진 트리 모나드 구현

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) 

그래서 내가 돈을 '여기

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

을 내 모나드에 대한 (>> =) 연산자이다 올바른 잎 모양을 얻을 수있는 방법을 이해하고 있습니까?

어떤 도움

감사

을 감사

답변

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

나는 같은 방식으로 Monad typeclass를 구현했다. 그러나이 컴파일을 실행하면 항상 무한 루프가됩니다. 제 생각에이 Tree-type에 대한 Monad typeclass를 구현하는 것은 불가능합니다. 아니면 내가 틀렸어? – user4587483