首页 > 解决方案 > 无法将类型“Integer”与“Int”匹配

问题描述

我开始了我的 Haskell 之旅并遇到了我的第一个问题:

在我的 Haskell 脚本中:

myList = [1, 2, 3, 4, 5, 6, 7]

average ns = sum ns `div` length ns

当我在时ghci repl,我得到两个不同的结果:

我理解(至少我认为我理解)没有变量的概念,所以myList只是一个函数,每次我调用它时都会返回一个“硬编码”列表。

我怎样才能使这项工作,为什么它会这样?

标签: haskell

解决方案


length将返回一个Intwhilesum将返回一个与列表中相同类型的项目的数字(这里可能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


推荐阅读