为什么我在 haskell 中的乘法函数不允许我乘以浮点数?
why is my multiplication function in haskell not letting me multiply a float?
所以这是我的乘法函数:
multiplicacion n 1 = n
multiplicacion n m = n + (multiplicacion n (m - 1))
适用于整数,但在尝试乘以浮点数时:
*Main> multiplicacion 4.1 4
16.4
可行,但如果第二个参数也是浮点数,则会发生这种情况:
*Main> multiplicacion 4 4.1
函数中断。
要查看发生了什么,展开函数执行 - 即用函数体重复替换函数调用。
让我们考虑第一个例子:
multiplication 4.1 4
= 4.1 + (multiplication 4.1 (4 - 1))
= 4.1 + (4.1 + (multiplicaiton 4.1 (3 - 1))
= 4.1 + (4.1 + (4.1 + (multiplicaiton 4.1 (2 - 1)))
= 4.1 + (4.1 + (4.1 + 4.1)
= 16.4
现在我们来看第二个例子:
multiplication 4 4.1
= 4 + (multiplication 4 (4.1 - 1))
= 4 + (4 + (multiplication 4 (3.1 - 1)))
= 4 + (4 + (4 + (multiplication 4 (2.1 - 1))))
= 4 + (4 + (4 + (4 + (multiplication 4 (1.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (multiplication 4 (0.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-0.9 - 1))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-1.9 - 1)))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-2.9 - 1))))))))
... and so on
第二个参数永远不会等于一个,因此第一个定义 multiplication n 1 = n
永远不会匹配,因此函数将永远调用自己。
您的函数只能乘以正整数。给它一个小数会导致无限循环。
问题是您每次调用都将 m
减 1。那么让我们看看 mult 4 4.1
会发生什么,展开每一行:
mult 4 4.1
4 + (mult 4 3.1)
4 + (4 + (mult 4 2.1))
4 + (4 + (4 + (mult 4 1.1)))
4 + (4 + (4 + (4 + (mult 4 0.1)))))
4 + (4 + (4 + (4 + (4 + (mult 4 (-0.9)))))))
...
基于这个展开,你能看出这里出了什么问题吗?因为在任何阶段 m
实际上 等于 1
,你永远不会达到基本情况。
所以这是我的乘法函数:
multiplicacion n 1 = n
multiplicacion n m = n + (multiplicacion n (m - 1))
适用于整数,但在尝试乘以浮点数时:
*Main> multiplicacion 4.1 4
16.4
可行,但如果第二个参数也是浮点数,则会发生这种情况:
*Main> multiplicacion 4 4.1
函数中断。
要查看发生了什么,展开函数执行 - 即用函数体重复替换函数调用。
让我们考虑第一个例子:
multiplication 4.1 4
= 4.1 + (multiplication 4.1 (4 - 1))
= 4.1 + (4.1 + (multiplicaiton 4.1 (3 - 1))
= 4.1 + (4.1 + (4.1 + (multiplicaiton 4.1 (2 - 1)))
= 4.1 + (4.1 + (4.1 + 4.1)
= 16.4
现在我们来看第二个例子:
multiplication 4 4.1
= 4 + (multiplication 4 (4.1 - 1))
= 4 + (4 + (multiplication 4 (3.1 - 1)))
= 4 + (4 + (4 + (multiplication 4 (2.1 - 1))))
= 4 + (4 + (4 + (4 + (multiplication 4 (1.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (multiplication 4 (0.1 - 1)))))
= 4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-0.9 - 1))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-1.9 - 1)))))))
= 4 + (4 + (4 + (4 + (4 + (4 + (4 + (4 + (multiplication 4 (-2.9 - 1))))))))
... and so on
第二个参数永远不会等于一个,因此第一个定义 multiplication n 1 = n
永远不会匹配,因此函数将永远调用自己。
您的函数只能乘以正整数。给它一个小数会导致无限循环。
问题是您每次调用都将 m
减 1。那么让我们看看 mult 4 4.1
会发生什么,展开每一行:
mult 4 4.1
4 + (mult 4 3.1)
4 + (4 + (mult 4 2.1))
4 + (4 + (4 + (mult 4 1.1)))
4 + (4 + (4 + (4 + (mult 4 0.1)))))
4 + (4 + (4 + (4 + (4 + (mult 4 (-0.9)))))))
...
基于这个展开,你能看出这里出了什么问题吗?因为在任何阶段 m
实际上 等于 1
,你永远不会达到基本情况。