【问题标题】:Pattern Matching : function to return number of additions and constants模式匹配:返回加法数和常数的函数
【发布时间】:2013-05-30 17:45:06
【问题描述】:

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

谢谢。

【问题讨论】:

  • 表达式是什么形式的?你能链接到练习吗?
  • 抱歉忘记添加了。已编辑但仍无法理解。

标签: haskell functional-programming pattern-matching


【解决方案1】:

计算加法

我们看看什么时候有加法:

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 +吗?

试一试,看看你过得怎么样。

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2022-07-12
    • 1970-01-01
    相关资源
    最近更新 更多