2016-11-07 64 views
0

以下代碼序列在輸入|上生成解析錯誤。 如果輸入當時的葉節點調用leafFunc與價值 如果輸入當時的樹節點調用TreeFunc與左子樹,值,右子樹在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 

我在Haskell一個新手。

+2

解析錯誤結果所形成的格式不正確警惕聲明。在'|'之前不應該放一個等號。之後還有其他一些事情需要處理,包括在警衛中應用foldTree和正確數量的參數。 – mnoronha

+0

我想在「=」之後進行模式匹配。我怎樣才能做到這一點 ? :) TIA –

+1

你很混淆函數/保護語法。在警衛的右側,包括謂詞(評估爲「真」或「假」的函數)和相應的值賦值。如果您想要模式匹配不同的案例(葉節點與節點),您可以使用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