Haskell 如何定义NAT上的乘法?
我在Haskell中的Haskell 如何定义NAT上的乘法?,haskell,Haskell,我在Haskell中的Nats上定义mult时遇到问题 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
Nat
s上定义mult
时遇到问题
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))
这里的问题是由哪个部分引起的
解决了
纳特:自然的
Z:零
骡子:乘
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(SM)(SN)=S(mult m n)
这是与(1+m)(1+n)=1+mn相同的错误方程式
所以我把方程改为
mult(sn)m=plus m(mult n m)--(n+1)*m=m+nm
谢谢你回答我的问题。多亏了你的帮助,我很容易就完成了。让我们仔细考虑一下。我们不做两边的模式匹配,只做一个。因此:
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
。让我们更仔细地考虑一下。我们不做两边的模式匹配,只做一个。因此:
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
。你能用自己的话解释一下mult
的最后一行是什么意思吗?从你对代数的了解来看,这个等式对你合适吗<代码>(1+x)*(1+y)=1+x*y。这就是你所写的关于mult
的第三个定义方程。提示:你如何根据x
和y
计算(x+1)*y
?我们的教授缩写为multiply->mult。所以我使用了它。@4320如果你已经解决了你的问题,请在下面添加一个答案,解释你发现了什么以及你是如何解决的。这样,有类似问题的未来访客可以从您的发现中学习。(一开始问一个问题和回答一个问题似乎有些奇怪,但在这里它被认为是完全礼貌的,甚至是可取的。)你能用自己的话解释一下mult的最后一行是什么意思吗?从你对代数的了解来看,这个等式对你合适吗<代码>(1+x)*(1+y)=1+x*y。这就是你所写的关于mult
的第三个定义方程。提示:你如何根据x
和y
计算(x+1)*y
?我们的教授缩写为multiply->mult。所以我使用了它。@4320如果你已经解决了你的问题,请在下面添加一个答案,解释你发现了什么以及你是如何解决的。这样,有类似问题的未来访客可以从您的发现中学习。(一开始,提问和回答问题似乎有些奇怪,但在这里,这被认为是完全礼貌的,甚至是可取的。)