Haskell错误:无法将预期类型“Integer”与推断类型“Int”匹配

时间:2010-02-20 08:02:58

标签: haskell types integer

我有一个haskell函数,可以计算有限Ints列表的大小。我需要输出类型为Integer,因为该值实际上会大于Int的最大边界(如果输出类型是Int,则结果将是-1)

size :: a -> Integer
size a =  (maxBound::Int) - (minBound::Int)

我理解Ints(有界)和整数(无界)之间的区别,但我想从Int创建一个Integer。我想知道是否有像fromInteger这样的函数,这将允许我将Int转换为Integer类型。

3 个答案:

答案 0 :(得分:11)

您需要将值转换为Integers,这可以通过fromIntegral函数(Haskell的数字转换)完成:

fromIntegral :: (Integral a, Num b) => a -> b

它将Integral类中的任何类型转换为(较大的)Num类中的任何类型。 E.g。

fromIntegral (maxBound::Int) - fromIntegral (minBound::Int)

然而,我真的不相信你所采取的方法 - 它似乎非常脆弱。承认环绕的类型存在的行为是非常可疑的。

你的意思是:“有限Ints列表的大小”。如果它不是列表的长度,那么这个意义上的大小是多少?

答案 1 :(得分:4)

我相信你在寻找:

fromIntegral :: (Integral a, Num b) => a -> b

将Integer转换为Int

答案 2 :(得分:0)

也许你假设Haskell像许多主流语言一样,如C和(在某种程度上)Java,具有隐式数字强制。它不是:Int和Integer是完全不相关的类型,并且它们之间有一个特殊的转换函数:fromIntegral。它属于Num类型类。查看文档:本质上,fromIntegral不仅仅是:它是一个通用的“构造任意整数的表示”,t.i。如果你正在实现某种数字并实例化Num,你必须提供一种方法来构造你的类型的整数。例如,在复数的Num实例中,fromIntegral创建一个具有零虚部和复数实部的复数。

Haskell隐式数值强制的唯一意义是整数文字被重载,当你写42时,编译器隐式将其解释为“fromIntegral(42 :: Integer)”,因此你可以在任何上下文中使用整数其中需要Num类型。