我已经有一个add函数如何在乘法函数中使用它?

时间:2015-09-05 11:51:40

标签: haskell

到目前为止,我对n-1和n + 1的定义分别为suc和inc

add x y | y > 0 = add (inc x) (suc y)
add x y | y < 0 = add (suc x) (inc y)
add x 0 = x
add 0 y = y

如何在我的乘法函数中仅使用递归,if-then和no +, - 等来使用它

我知道x * y的结果等于将y加到(x-1)* y的结果

但我不知道如何将其放入代码中。感谢。

2 个答案:

答案 0 :(得分:3)

如果我们将自然数定义为:

data Nat where
    Zero :: Nat        -- 0
    Succ :: Nat -> Nat -- \n -> n + 1

然后,我们可以按如下方式定义add

add :: Nat -> Nat -> Nat
add n Zero     = n              -- n + 0 = n
add n (Succ m) = Succ (add n m) -- n + (m + 1) = (n + m) + 1

接下来,我们可以用mul

来定义add
mul :: Nat -> Nat -> Nat
mul n Zero     = Zero            -- n * 0 = 0
mul n (Succ m) = add (mul n m) n -- n * (m + 1) = (n * m) + n

同样,我们可以根据exp

来定义mul
exp :: Nat -> Nat -> Nat
exp n Zero     = Succ Zero       -- n ^ 0 = 1
exp n (Succ m) = mul (exp n m) n -- n ^ (m + 1) = (n ^ m) * n

注意这里的模式?这称为primitive recursion

答案 1 :(得分:1)

基本实现是:

mul x 0 = 0
mul x y = add x (mul x (y - 1))

您需要将y - 1替换为您的递减函数(奇怪地命名为suc)。这也不适用于负乘数,但你可以使用它。