2017-04-04 1 views
0

私は次のようにHaskellでのバイナリツリーの定義を持っています私は単純にすべての値を合計するこの関数を作ることができます:バイナリツリーの折りたたみ機能は

しかし、これは動作しません、私は私の人生のためにすることはできません理由を見つけてください。 私は取得していますエラーメッセージの有用な部分は次のとおりです。エラーはあなたがいる場合タイプ

(x -> u -> u -> u) 

をパラメータとして

(+) :: (Num a) => a -> a -> a 

を使用しようとしてからおよそ来

Couldn't match type `a` with `a -> a' 
`a' is a rigid type variable bound by the type signature for: 
sumBFold :: forall a. Num a => BTree a -> a 
Expected type: (a -> a) -> a -> a -> a 
Actual type: (a -> a) -> (a -> a) -> a -> a 
In the first argument of folB namely `(+)` 
+1

'foldB'に渡す必要がある関数は3つのパラメータをとりますが、'(+) 'は2つだけです。 – Lee

答えて

1

(x -> u -> u -> u)(x -> (u -> (u -> u)))

と同じであることを覚えておいてください。
x == a 
u == a 
u -> u == a -> a == a 

これは間違いの原因となります。

次のいずれかを考慮してください。

sumBFold :: (Num a) => BTree a -> a 
sumBFold = foldB add3 where add3 x y z = x + y + z 
sumBFold = foldB $ \x y z -> x + y + z 
sumBFold = foldB ((.) (+) . (+)) 
+0

答えを明確にしていただきありがとうございます。私はまだ関数型プログラミングには新しく、タイプによって投げ捨てられるのは簡単です – Stinkidog

関連する問題