为表达式的数据类型创建类TreeClass的实例

时间:2014-09-20 09:47:52

标签: haskell recursion

如果我有一个数据类型Expr

data Expr = ExprNum Double -- constants
          | ExprVar String -- variables
          | ExprAdd Expr Expr
          | ExprSub Expr Expr
          | ExprNeg Expr -- The unary '-' operator
          | ExprMul Expr Expr
          | ExprDiv Expr Expr
          deriving Show

我在其中创建了一个类TreeClass                   subTrees :: t - > [T]

我为数据类型MTree创建了一个类的实例      数据MTree a = MTree a [MTree a]              派生秀

instance TreeClass (MTree a) where
subtrees (MTree _ ss) = ss

singleton a = MTree a []

现在我希望对Expr数据类型执行相同的操作。我有类似的表达式 ex1的等式是ex1 = y + x * 11/100 这必须被制作成树并计算高度和各种参数,如节点数,叶子数等。

ex1 = ExprAdd (ExprVar "y")(ExprMul (ExprVar "x")(ExprDiv (ExprNum 11) (ExprNum 100)))

表达式是树。 我试着为Expr数据类型编写subTree函数,如下所示

instance TreeClass Expr where
subtrees a  = a

计算树的高度 高度函数写为

height :: (TreeClass t) => t -> Int
height t = 1 + foldl (\x y -> max x (height y)) 0 (subtrees t)

numNodes :: (TreeClass t) => t -> Int
numNodes t = 1 + foldl (\x y -> x + numNodes y) 0 (subtrees t)

leafs :: (TreeClass t) => t -> [t]
leafs t = case subtrees t of
  [] -> [t]
  st -> foldl (\x y -> x ++ leafs y) [] st

但是当在ghci(高度ex1)上执行它时,它进入无限循环。 我知道在为Expr数据类型编写subTree Expression时出错了。

如何执行高度ex1?

1 个答案:

答案 0 :(得分:2)

你说a是它自己的子树,所以当height试图计算子树的高度时,它会以无限循环结束。

您需要通过案例分析在Expr的不同构造函数上编写子树。例如,ExprAdd的大小写为:

subtrees (ExprAdd e1 e2) = [e1, e2]