如何在Nats上定义乘法?

时间:2018-05-20 14:14:12

标签: haskell

我在Haskell中mult上定义Nat时遇到问题。

mult :: Nat -> Nat -> Nat
mult  Z    m = Z
mult  m    Z = Z
mult (S m)(S n) = S (mult m n)
two    = S (S Z)
three  = S (S (S Z))

我得到了这些结果:

> mult Z three             
Z
> mult two three
S (S Z)
> mult three three
S (S (S Z))

哪个部分导致问题?

解决。

Nat:自然

Z:零

mult:乘法

mult :: Nat -> Nat -> Nat

mult Z    m = Z                       -------- 0*m = 0

mult (S n) m = plus m (mult n m)      -------- (n+1)*m = m+nm


> mult Z three             
Z
> mult two three
S (S (S (S (S (S Z)))))
> mult three three
S (S (S (S (S (S (S (S (S Z))))))))

我的手机有方程式问题

mult(S m)(S n)= S(mult m n)

与(1 + m)(1 + n)= 1 + m n

相同的方程是不正确的

所以我改变了等式

mult(S n)m =加m(mult n m) ---(n + 1)* m = m + nm

感谢谁回答了我的问题。由于你的帮助,我很容易完成。

1 个答案:

答案 0 :(得分:3)

让我们更仔细地考虑一下。不要在两边进行模式匹配,而是只做一个。所以:

mult :: Nat -> Nat -> Nat
mult  Z    m = -- TODO: 0 * m = ???
mult (S n) m = -- TODO: (1 + n) * m = ???

让我们从0 * m开始,显然是0

mult  Z    m = Z

现在为(1 + n) * m。从简单的代数来看,这是m + n*m。因此,假设您已经在某处创建了plus函数,这很容易:

mult (S n) m = plus m (mult n m)

请注意,plus的实现是必需的。如果您理解这一点,请尝试通过双方的模式匹配重写mult