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

时间:2012-01-14 19:15:21

标签: haskell instance show

在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 个答案:

答案 0 :(得分:12)

问题是min接受两个参数(并返回两个参数中的最小值),但是你只指定了一个参数;你想要minimum,这是适用于列表的版本。

具体而言,出现此错误是因为GHCi尝试打印出您评估的表达式的结果,但在这种情况下,您已将min应用于一个参数,从而产生另一个函数。 1 GHCi尽职尽责地尝试打印出来,但它失败了,因为函数不是Show的实例,Integer -> Integer -> Integer是可以表示为显示字符串的标准类型类。

1 在Haskell中,所有函数都接受一个参数,多个参数的函数是从返回其他函数的函数构建的;例如,添加两个整数的函数可能具有类型Integer -> (Integer -> Integer),即{{1}} - 一个函数接受一个I​​nteger并返回另一个函数,该函数本身接受一个I​​nteger,并返回一个Integer。值得庆幸的是,您不必经常以这样明确的方式考虑这一点,或者它会变得非常混乱!