Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何定义NAT上的乘法?_Haskell - Fatal编程技术网

Haskell 如何定义NAT上的乘法?

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

我在Haskell中的
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如果你已经解决了你的问题,请在下面添加一个答案,解释你发现了什么以及你是如何解决的。这样,有类似问题的未来访客可以从您的发现中学习。(一开始,提问和回答问题似乎有些奇怪,但在这里,这被认为是完全礼貌的,甚至是可取的。)