如果我有一个数据类型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?
答案 0 :(得分:2)
你说a
是它自己的子树,所以当height
试图计算子树的高度时,它会以无限循环结束。
您需要通过案例分析在Expr
的不同构造函数上编写子树。例如,ExprAdd
的大小写为:
subtrees (ExprAdd e1 e2) = [e1, e2]