【问题标题】:Generates parse input error in haskell在haskell中生成解析输入错误
【发布时间】:2016-11-07 01:10:20
【问题描述】:

以下代码序列在输入 | 上生成解析错误。 如果输入是叶节点,则使用值调用 leafFunc 如果输入是一个树节点,那么用左子树、值、右子树调用 TreeFunc

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的新手。

【问题讨论】:

  • 解析错误结果表明您的保护语句格式不正确。您不应该在| 之前放置等号。在那之后你还有一些其他的事情需要解决,包括在守卫中应用具有正确数量参数的 foldTree。
  • 我想在 "=" 之后进行模式匹配。我怎样才能做到这一点 ? :) TIA
  • 您混淆了函数/保护语法。在守卫的右侧,您包括谓词(评估为TrueFalse 的函数)和相应的值分配。如果您想对不同的情况(叶与节点)进行模式匹配,您可以使用 case 语句或通过手动将多个情况与函数声明进行匹配来实现。我建议您阅读以下内容:learnyouahaskell.com/syntax-in-functions

标签: haskell functional-programming


【解决方案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

【讨论】:

    【解决方案2】:

    我猜这就是你想要的

    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
    

    【讨论】:

      猜你喜欢
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2014-09-18
      • 2013-05-28
      • 2016-01-11
      相关资源
      最近更新 更多