我有一个haskell函数,可以计算有限Ints列表的大小。我需要输出类型为Integer,因为该值实际上会大于Int的最大边界(如果输出类型是Int,则结果将是-1)
size :: a -> Integer
size a = (maxBound::Int) - (minBound::Int)
我理解Ints(有界)和整数(无界)之间的区别,但我想从Int创建一个Integer。我想知道是否有像fromInteger这样的函数,这将允许我将Int转换为Integer类型。
答案 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类型。