我试图围绕Haskell类型强制包裹我的头。意思是什么时候可以将一个值传递给一个函数而不需要投射以及它是如何工作的。这里是一个具体的例子,但我在寻找我可以用前进,试图了解正在发生的事情更一般的解释是: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类型的问题,就无法进行基本的数学运算。我的意思是有一个显而易见的方法可以在这些之间自动转换,为什么我不得不考虑这个并处理它?我开始做错了什么?
我基本上正在寻找一种方法来轻松地编写简单的算术表达式,而不必担心整洁的伟大的细节,并保持代码的漂亮和干净。在大多数顶级语言中,编译器为我工作 - 而不是相反。
快速提示:请尝试在源文件中执行此操作,而不是直接在GHCi中执行此操作。它会以这种方式为你提供更多的东西,因为它可以查看整个程序,而不是一次处理一行。 –
这个问题是基于一个不起作用的整个程序。我已经隔离了编译器正在抱怨的这个特定部分。我可以发布整个事情,但我认为它不会有多大帮助。 – oneself
你的问题已被回答,但是:“有一种明显的方法可以在这些之间自动转换。”有真的吗?当我想要一个'Double',或者甚至是一个'Int64'时,'2^128 :: Integer'应该自动变成什么?当然,由于四舍五入,从非整数类型到整数类型不可能是自动的。一般来说,Haskell没有子类型或自动类型强制;它具有(约束)参数多态性。但是一旦一个类型变成具体/单形的,那个类型的值就只有*这种类型。 –