Haskell新手: map函数中没有Show的实例

6
在GHCI中,我输入以下内容:
map (+1) [1..10]

这将返回 [2,3,4,5,6,7,8,9,10,11]。

到目前为止都很顺利。

现在我输入:

min (map (+1) [1..10])

我收到了以下错误信息:
No instance for (Show ([b0] -> [b0]))
  arising from a use of `print'
Possible fix: add an instance declaration for (Show ([b0] -> [b0]))
In a stmt of an interactive GHCi command: print it

这对我来说很奇怪。为什么Haskell认为我尝试打印任何参数,我该如何修复它?

1个回答

13
问题在于 min 需要两个参数(并返回其中较小的),但你只指定了一个;你需要的是可以在列表上运行的版本 minimum
具体来说,这个错误发生是因为 GHCi 尝试打印出你评估的表达式的结果,但在这种情况下,你已经将 min 应用到一个参数上,产生了另一个函数。1 GHCi 尝试打印它,但失败了,因为函数不是 Show 的实例,Show 是一个可以被表示为显示字符串的标准类型类。

1 在 Haskell 中,所有函数都只有一个参数,多个参数的函数是通过返回其他函数构建的;例如,一个将两个整数相加的函数可能具有类型 Integer -> Integer -> Integer,它是 Integer -> (Integer -> Integer) 的函数——它接受一个整数并返回另一个函数,该函数本身接受一个整数并返回一个整数。幸运的是,你通常不必以这种明确的方式去思考它,否则会变得非常混乱!


谢谢!由于某种原因,我认为min(最小值)像sum(求和)或product(乘积)一样作用于列表。minimum! - Bylextor
@Bylextor:不用客气!如果我的回答对你有帮助,你应该点击旁边的勾选标记来帮助未来的其他人 :) - ehird
太好了,那是一个很棒的解释! - Bylextor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接