在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认为我正在尝试打印任何参数,我该如何解决这个问题?
答案 0 :(得分:12)
问题是min
接受两个参数(并返回两个参数中的最小值),但是你只指定了一个参数;你想要minimum
,这是适用于列表的版本。
具体而言,出现此错误是因为GHCi尝试打印出您评估的表达式的结果,但在这种情况下,您已将min
应用于一个参数,从而产生另一个函数。 1 GHCi尽职尽责地尝试打印出来,但它失败了,因为函数不是Show
的实例,Integer -> Integer -> Integer
是可以表示为显示字符串的标准类型类。
1 在Haskell中,所有函数都接受一个参数,多个参数的函数是从返回其他函数的函数构建的;例如,添加两个整数的函数可能具有类型Integer -> (Integer -> Integer)
,即{{1}} - 一个函数接受一个Integer并返回另一个函数,该函数本身接受一个Integer,并返回一个Integer。值得庆幸的是,您不必经常以这样明确的方式考虑这一点,或者它会变得非常混乱!