haskell - 无法将类型“Integer”与“Int”匹配
问题描述
我开始了我的 Haskell 之旅并遇到了我的第一个问题:
在我的 Haskell 脚本中:
myList = [1, 2, 3, 4, 5, 6, 7]
average ns = sum ns `div` length ns
当我在时ghci repl
,我得到两个不同的结果:
- 如果我输入
> average [1, 2, 3, 4]
我得到的期望值2
- 但如果我尝试使用 myList 和 type
> average myList
,我会收到错误“无法将类型 'Integer' 与 'Int' 匹配”;
我理解(至少我认为我理解)没有变量的概念,所以myList
只是一个函数,每次我调用它时都会返回一个“硬编码”列表。
我怎样才能使这项工作,为什么它会这样?
解决方案
length
将返回一个Int
whilesum
将返回一个与列表中相同类型的项目的数字(这里可能Integer
)。
您可以使用fromIntegral :: (Integral a, Num b) => a -> b
将类型的数字转换Integral
为任何Num
类型,例如将 anInt
转换为Integer
.
因此,我们可以将其实现为:
average :: Integral a => [a] -> a
average ns = sum ns `div` fromIntegral (length ns)
因为您使用div :: Integral a => a -> a -> a
将因此将两个操作数和结果限制为相同的类型,并且该类型应该是类型类的成员Integral
。
推荐阅读
- arrays - 使用 matrix[mid/m][mid%m] 进行二分搜索找到 2D 矩阵的中间值(如 1D 数组)背后的直觉是什么?
- javascript - 如何使用来自 javascript 的参数实例化 pug mixin?
- c - 如何将 uint64_t 写入 C 中的 char* 缓冲区
- r - R:按日期合并两个数据集的特殊情况
- r - 在 R 中导出为 pdf 时未显示 Unicode 字符
- hive - Hudi 数据集上的 Hive
- git - `git restore --source=HEAD :/` 在克隆具有长文件名的 repo 失败后不起作用
- autohotkey - 监听 {space} 输入
- xslt - 使用另一个 XSLT 组合来自多个 XSLT 的响应
- docker - 无法在 nginx rtmp 模块上运行 exec