【发布时间】:2016-11-15 18:18:42
【问题描述】:
我是 Haskell 的新手,所以这可能是一个愚蠢的问题。我正在读一本书,上面写着:type sum 应该显示sum :: (Num a) => [a] -> a。而不是那个消息是sum :: (Num a, Foldable t) => t a -> a。正如我在https://www.haskell.org/hoogle/?hoogle=Sum 中看到的那样,这种差异是由于-我认为-存在两个不同的求和函数。也许这类似于 Java 中的多态性,我才刚刚开始,我不知道 Haskell 是如何工作的。
所以我的问题是:我如何使用类型为sum :: (Num a) => [a] -> a 的 sum 函数而不是另一个?你能解释一下这里发生了什么吗?
【问题讨论】:
-
列表
sum在Prelude中,即默认在范围内,所以如果你不做任何特别的事情,你会使用它。要引用另一个sum,您需要导入Data.Foldable。那么你到底有什么疑问呢?如果有歧义,编译器应该报告它。 -
@laughedelic 在最近的 GHC 版本中,Prelude
sum与Data.Foldable中的相同。 -
@duplode 酷!我不知道这些变化。
-
新 Prelude 类型的通用性很容易混淆。每当您在约束中看到
Foldable t时,将每个t a替换为[a]以获得更简单的情况。
标签: haskell types sum foldable