旧版本Curry无法使用fromInteger、realtoFrac如何解决
问题原因
旧版本Curry(尤其是早期PAKCS发行版)的Prelude没有兼容Haskell的fromInteger、realToFrac这两个隐式重载转换函数,早期Curry的数值类型系统没有实现和Haskell一致的Num类层次结构,也没有默认启用隐式数值类型转换,所以会提示函数未定义。
解决方案
1. 替换为旧版本原生支持的显式转换函数
旧版本Curry Prelude默认提供了各类数值类型互转的显式函数,直接按需调用即可:
- Integer转其他类型:
- 转Int:使用
integerToInt - 转Float:使用
integerToFloat - 转Double:使用
integerToDouble
- 转Int:使用
- Int转其他类型:
- 转Float:使用
intToFloat - 转Double:使用
intToDouble - 转Integer:使用
intToInteger
- 转Float:使用
- Float/Double互转/转整型:
- Float转Double:使用
floatToDouble - Double转Float:使用
doubleToFloat - 浮点型转整型可使用
truncate/round/ceiling/floor函数
- Float转Double:使用
2. 兼容Haskell代码的别名配置
如果需要复用已有的Haskell代码不想修改函数名,可以在代码开头手动加函数别名:
-- 示例:定义fromInteger别名用于Integer转Int fromInteger :: Integer -> Int fromInteger = integerToInt -- 示例:定义realToFrac别名用于Int转Float realToFrac :: Int -> Float realToFrac = intToFloat
注意:旧版本Curry对多态重载的支持不完善,建议根据实际使用场景指定别名的具体类型,避免出现编译错误
3. 查看当前版本可用转换函数
如果不确定当前版本支持哪些转换函数,可以在交互环境执行:browse Prelude,搜索名称带to/from的数值相关函数即可。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

