上学时我们开始学习Haskell。我们使用Helium compiler因为它快速且易于使用。
我开始输入标准函数,例如*
,+
...
但该部门不起作用。我尝试了5 / 2
或4 / 2
并收到了此消息:
"Type error in infix application
expression : 3 / 5
operator : /
type : Float -> Float -> Float
does not match : Int -> Int -> a "
如何使用devision运算符从2.5
获取5 / 2
?
我尝试div 5 2
,但后来我2
而不是2.5
答案 0 :(得分:9)
- 数字文字不会重载(即使使用
--overloading
标志)。因此,3
属于Int
类型,3.0
类型为Float
。结果是你永远不能写2 + 2.3
,虽然在重载模式下你可以同时写2 + 3
和2.0 + 3.0
。
此外:
- 有五个内置类型类,包含以下实例:
- Num:
Int
,Float
因此,为了获得浮点除法,您必须使用显式浮点文字,例如5.0 / 2.0
。
值得注意的是,在Haskell本身(Helium只是Haskell的一个子集)中,表达式5 / 2
的类型很好,并且类型为Fractional a => a
,但Helium似乎没有{ {1}}类型数组,只有Fractional
和Int
作为数字类型,因此实际上有效的Haskell可以正常工作在Helium中不起作用。
如果您使用的是Helium,根据网站的说明,您可能会使用Float
安装它:
cabal
然后您应该可以访问GHC和GHCi。尝试运行GHCi作为交互式shell,看看是否有帮助。您可能会遇到比Helium更难读的错误,但Haskell的类型错误在绝大多数情况下都非常有用。
答案 1 :(得分:2)
错误消息显示/
期望浮点(“真实”)数字,并且您提供整数。
您可以使参数显式浮点:5.0 / 2.0
。
您可以将值转换为浮点(在GHC中工作,没有尝试使用Helium):
let a = 1::Int
let b = 2::Int
-- here a / b gives a type error like you reported
show $ fromIntegral a / fromIntegral b -- works