【问题标题】:Tree works in Haskell树在 Haskell 中工作
【发布时间】:2014-04-30 21:39:06
【问题描述】:

我正在做一个项目并且遇到了一些困难,因为我不习惯 Haskell,而且它对我来说是一种很难编码的语言。

我想要一棵有叶子和树枝的树,叶子只能作为整数输入,比如 1,2,3。 分支将仅为 operation1 和 operation2 的字符。

这些操作从叶子中获取输入并进行计算并将输出发送到其他分支并再次进行计算,直到它到达顶部。

到目前为止我的代码:

data Tree = Leaf Float | Branch Char Tree Tree deriving (Show,Eq,Ord)

insertElement x (Leaf y) = Leaf y

insertElement x (Branch a left right) = Branch a (insertElement x left) right                                                           
doIt (x:xs) (y:ys) =  insertElement ((Branch y (Leaf x) (Leaf (head xs))))                                  

op1 num1 num2 = 1+num1+num2*2
op2 num1 num2 = 1-num1*num2*2

树将被递归创建,我尝试使用 foldr 来执行此操作但没有工作,因为它不是二叉树。

任何帮助都会很好。

【问题讨论】:

  • 我也不能为递归编写多个语句 :) 我猜它是一个haskell 的事情......
  • 如果您使用 Hlint 并对您的函数进行类型注释,那就太好了;这有助于编译器和我们推理您的代码
  • 如果你的函数有合理的名字也会有很大帮助——比如 insertChar/insertElement,但是 doIt 什么也没说
  • 您的问题陈述很难理解。我认为您想为由数字常量和两个操作(op1,op2)组成的简单表达式语言表示句法树。您的 doIt 函数旨在评估表示的表达式。不过,我仍然看不到insertElement 的用途。
  • @AtikBayraktar 我回滚了您的编辑,以便可以看到您的代码。这将帮助遇到此问题的其他人寻找类似问题的解决方案。保留完整问题被认为是礼貌的做法,但您可以在原始问题的文本下方随意添加其他编辑。

标签: function haskell recursion tree


【解决方案1】:

我不确定我是否理解这个问题,但也许你想要这样的东西:

data Op = Op1 | Op2
data Tree = Leaf Float | Branch Op Tree Tree

eval :: Tree -> Float
eval (Leaf x) = x
eval (Branch Op1 l r) = op1 (eval l) (eval r)
eval (Branch Op2 l r) = op2 (eval l) (eval r)

op1 :: Float -> Float -> Float
op1 num1 num2 = 1+num1+num2*2
op2 :: Float -> Float -> Float
op2 num1 num2 = 1-num1*num2*2

example :: Float
example = eval (Branch Op1 (Leaf 3) (Branch Op2 (Leaf 2) (Leaf 1)))

如果您想这样做,请考虑使用比Tree 更通用的类型,例如

data Exp = Lit Float | Op1 Exp Exp | Op2 Exp Exp
eval :: Exp -> Float
eval (Lit x) = x
eval (Op1 l r) = op1 (eval l) (eval r)
...

【讨论】:

  • 是的,实际上我之前想过将 ops 作为数据,但不知道我可以在我的树中使用它。感谢那。我会试试的。
  • 我正在尝试使其对值列表进行递归操作。 Foldr 可以使用一个列表,但我有 2 个用于输入叶和操作的列表,无论是 1 还是 2。你有什么建议?现在我看到它会从树中读取它,所以我必须递归地创建树然后执行操作..上帝哈斯克尔很烦人..这是我问的问题:)
  • 以这种方式修复它...谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-10-19
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多