2016-11-07 16 views
0

以下のコードシーケンスは、入力時に解析エラーを生成しています|。 入力は、入力がツリーノードが、私はHaskellでは初心者です左サブツリー、値、右のサブツリーhaskellで構文解析入力エラーを生成します

data Tree t = Leaf t 
     | Node (Tree t) t (Tree t) 

foldTree :: (t1 -> t -> t1 -> t1) -> (t -> t1) -> Tree t -> t1 
foldTree treeFn leafFn tree= | foldTree (Leaf v) = leafFn(v) 
          | foldTree (Node left v right) = treeFn(left v right) 


Input : foldTree (\t1 t t2->t1 + 5*t + t2) (\x->x+9) (Leaf 5) 
Expected Output : 14 

Input : foldTree (\t1 t t2->t1 + 3*t + t2) (\x->x+5) (Tree (Leaf 3) 2 (Leaf 4)) 
Expected Output : 23 

でTreeFuncを呼び出した場合は、リーフノードはその値 でleafFuncを呼び出した場合。

+2

パースエラーの結果が正しくフォーマットされている、あなたのガード文を形成したいものです。 '|'の前に等号を置いてはいけません。 foldTreeにガード内の正しい数の引数を適用することを含め、後で修正するべきことがいくつかあります。 – mnoronha

+0

"="の後にパターンマッチングを行います。どうやってやるの ? :) TIA –

+1

あなたは機能/ガード構文が混乱しています。ガードの右側には、述語( 'True'または' False'に評価する関数)と対応する値の代入が含まれます。さまざまなケース(リーフとノード)をパターン化する場合は、case文を使用するか、関数宣言でいくつかのケースを手動で一致させることによって行うことができます。私はこれを読むことをお勧めします:http://learnyouahaskell.com/syntax-in-functions – mnoronha

答えて

1
data Tree t = Leaf t 
       | Node (Tree t) t (Tree t) 

foldTree :: (Tree t -> t -> Tree t -> t1) -> (t -> t1) -> Tree t -> t1 
foldTree treeFn leafFn (Leaf v) = leafFn v 
foldTree treeFn leafFn (Node left v right) = treeFn left v right 
1

私はこれを推測しているあなたは

data Tree t = Leaf t | Node (Tree t) t (Tree t) deriving Show 

foldTree :: (t1 -> t -> t1 -> t1) -> (t -> t1) -> Tree t -> t1 
foldTree treeFn leafFn tree 
       | foldTree (Leaf v) = leafFn v 
       | foldTree (Node left v right) = treeFn left v right 
関連する問題