模式匹配:返回加法和常量数的函数

时间:2013-05-30 17:45:06

标签: haskell functional-programming pattern-matching

我正在学习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)

谢谢。

1 个答案:

答案 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}}吗?

快去看看你是怎么过的。