首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell错误:无法将预期的类型‘`Integer’与推断的类型‘`Int’匹配

Haskell错误:无法将预期的类型‘`Integer’与推断的类型‘`Int’匹配
EN

Stack Overflow用户
提问于 2010-02-20 16:02:58
回答 3查看 8.7K关注 0票数 5

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

代码语言:javascript
运行
复制
size :: a -> Integer
size a =  (maxBound::Int) - (minBound::Int)

我知道Int (有界)和Integer (无界)之间的区别,但我想从Int生成Integer。我想知道是否有像fromInteger这样的函数,可以让我将Int类型转换为Integer类型。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-20 16:34:38

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

代码语言:javascript
运行
复制
fromIntegral :: (Integral a, Num b) => a -> b

它将整型类中的任何类型转换为(较大的) Num类中的任何类型。例如。

代码语言:javascript
运行
复制
fromIntegral (maxBound::Int) - fromIntegral (minBound::Int)

但是,我不会真正信任您所采用的方法--它似乎非常脆弱。在存在允许回绕的类型时的行为是非常可疑的。

你说的“有限整数列表的大小”到底是什么意思?如果它不是列表的长度,那么这个意义上的大小是多少?

票数 11
EN

Stack Overflow用户

发布于 2010-02-20 16:40:58

我相信你正在寻找:

代码语言:javascript
运行
复制
fromIntegral :: (Integral a, Num b) => a -> b

它会将Integer转换为Int

票数 4
EN

Stack Overflow用户

发布于 2010-02-21 21:09:17

也许您认为Haskell与许多主流语言(如C和(在某种程度上) Java )一样,具有隐含的数字强制。但事实并非如此: Int和Integer是完全不相关的类型,并且有一个特殊的函数可以在它们之间进行转换: fromIntegral。它属于Num类型类。看看文档:本质上,fromIntegral做了更多的事情:它是一个通用的“构造任意整数的表示”,TI.。如果您正在实现某种类型的数字并实例化Num,则必须提供一种方法来构造您的类型的整数。例如,在复数的Num实例中,fromIntegral创建了一个虚部为零、实部为整数的复数。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2301523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档