我有一个haskell函数,它可以计算有限整数列表的大小。我需要输出类型为Integer,因为该值实际上将大于Int的最大界限(如果输出类型为Int,则结果将是-1。)
size :: a -> Integer
size a = (maxBound::Int) - (minBound::Int)
我知道Int (有界)和Integer (无界)之间的区别,但我想从Int生成Integer。我想知道是否有像fromInteger这样的函数,可以让我将Int类型转换为Integer类型。
发布于 2010-02-20 16:34:38
您需要将值转换为整数,这可以通过fromIntegral函数(Haskell的数字转换)来完成:
fromIntegral :: (Integral a, Num b) => a -> b
它将整型类中的任何类型转换为(较大的) Num类中的任何类型。例如。
fromIntegral (maxBound::Int) - fromIntegral (minBound::Int)
但是,我不会真正信任您所采用的方法--它似乎非常脆弱。在存在允许回绕的类型时的行为是非常可疑的。
你说的“有限整数列表的大小”到底是什么意思?如果它不是列表的长度,那么这个意义上的大小是多少?
发布于 2010-02-20 16:40:58
我相信你正在寻找:
fromIntegral :: (Integral a, Num b) => a -> b
它会将Integer转换为Int
发布于 2010-02-21 21:09:17
也许您认为Haskell与许多主流语言(如C和(在某种程度上) Java )一样,具有隐含的数字强制。但事实并非如此: Int和Integer是完全不相关的类型,并且有一个特殊的函数可以在它们之间进行转换: fromIntegral。它属于Num类型类。看看文档:本质上,fromIntegral做了更多的事情:它是一个通用的“构造任意整数的表示”,TI.。如果您正在实现某种类型的数字并实例化Num,则必须提供一种方法来构造您的类型的整数。例如,在复数的Num实例中,fromIntegral创建了一个虚部为零、实部为整数的复数。
Haskell具有隐式数字强制的唯一意义是整数文字被重载,当您编写42时,编译器隐式地将其解释为"fromIntegral (42:: integer )",因此您可以在需要Num类型的任何上下文中使用整数。
https://stackoverflow.com/questions/2301523
复制相似问题