我在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
感谢谁回答了我的问题。由于你的帮助,我很容易完成。
答案 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
。