为什么我在 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,你永远不会达到基本情况。