1

我在 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)

谢谢你。

4

1 回答 1

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

但是在 aMultiply中,您要相乘的两个表达式中有很多:

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

试一试,看看你的进展如何。

于 2013-05-30T18:04:07.720 回答