我试图绕开 Haskell 类型的强制。意思是,什么时候可以将一个值传递给一个函数而不进行强制转换以及它是如何工作的。这是一个具体的例子,但我正在寻找一个更一般的解释,我可以用它来尝试理解发生了什么:
Prelude> 3 * 20 / 4
15.0
Prelude> let c = 20
Prelude> :t c
c :: Integer
Prelude> 3 * c / 4
<interactive>:94:7:
No instance for (Fractional Integer)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: 3 * c / 4
In an equation for `it': it = 3 * c / 4
(/) 的类型是小数 a => a -> a -> a。所以,我猜测当我使用文字执行“3 * 20”时,Haskell 会以某种方式假设该表达式的结果是分数。但是,当使用变量时,它的类型根据赋值预定义为 Integer。
我的第一个问题是如何解决这个问题。我是否需要转换表达式或以某种方式转换它?我的第二个问题是,这对我来说似乎很奇怪,因为你不能做基本的数学,而不必太担心 int/float 类型。我的意思是有一种明显的方法可以在这些之间自动转换,为什么我不得不考虑这个并处理它?我一开始是不是做错了什么?
我基本上是在寻找一种方法来轻松编写简单的算术表达式,而不必担心整洁的细节并保持代码整洁。在大多数顶级语言中,编译器对我有用——而不是相反。