2016-11-07 65 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