我正在学习Haskell中的模式匹配,我发现了一些据说对模式匹配有益的练习。
是否有人可以提供一些有关如何编写函数的信息,该函数将返回表达式中的加法运算数?
我看了一下但是找不到任何关于它的信息。实际上我怎样才能返回Haskell中的操作数量?
我不理解的另一个练习是编写一个函数,它将返回表达式中的常量数。我不明白他们对常数的意义。表达式中使用的变量可能是?
编辑:
我忘了添加表达式的定义。我发现与此相关的是:
示例(表达式树)
data Expression = Constant Integer
| Negate Expression
| Add Expression Expression
| Multiply Expression Expression
deriving Show
示例(评估表达式)
eval e = case e of
Constant c -> c
Negate e -> -(eval e)
Add e1 e2 -> (eval e1) + (eval e2)
Multiply e1 e2 -> (eval e1) * (eval e2)
谢谢。
答案 0 :(得分:2)
让我们看看何时有一个补充:
data Expression = Constant Integer
| Negate Expression
| Add Expression Expression -- here!
| Multiply Expression Expression
好的,让我们为那个
创建一个模式匹配函数countAdds :: Expression -> Int
常数中没有:
countAdds (Constant i) = 0
如果你否定某些东西,可能会有一些补充 - 让我们只计算它们并将其作为答案返回:
countAdds (Negate expr) = countAdds expr -- cool recursion trick
如果这里有一个Add
,那就是一个,但你要添加的两个表达式中可能会有更多的添加:
countAdds (Add expr1 expr2) = 1 + countAdds expr1 + countAdds expr2
但是在Multiply
中,你只是有两个表达式正在成倍增加:
countAdds (Multiply expr1 expr2) = countAdds expr1 + countAdds expr2
所有这一切都给出了:
countAdds :: Expression -> Int
countAdds (Constant i) = 0
countAdds (Negate expr) = countAdds expr -- cool recursion trick
countAdds (Add expr1 expr2) = 1 + countAdds expr1 + countAdds expr2
countAdds (Multiply expr1 expr2) = countAdds expr1 + countAdds expr2
您可以通过与计算添加内容的方式类似的方式解决其他问题。
对于操作总数,您需要为1 +
模式Multiply
,也可能为Negate
模式。1
模式。 (我不知道你是否只想计算加法和乘法之类的二元运算,或者像减数这样的一元运算。)
计算常量的工作方式非常相似,只不过你使用0
1 +
。你需要{{1}}吗?
快去看看你是怎么过的。