Haskell Newbie: нет экземпляра для функции Show in map - PullRequest
5 голосов
/ 14 января 2012

В 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

Это очень странно для меня. Почему Хаскелл считает, что я пытаюсь напечатать какие-либо аргументы, и как мне это исправить?

1 Ответ

12 голосов
/ 14 января 2012

Проблема в том, что min принимает два аргумента (и возвращает минимум двух), но вы указали только один; вам нужна minimum, версия, которая работает со списками.

В частности, эта ошибка возникает из-за того, что GHCi пытается распечатать результат вычисленных вами выражений, но в этом случае вы применили min к одному аргументу, создав другую функцию. 1 GHCi покорно пытается распечатать это, но терпит неудачу, потому что функции не являются экземпляром Show, стандартного класса типов для вещей, которые могут быть представлены как строки для отображения.

1 В Haskell все функции принимают один аргумент, а функции с несколькими аргументами создаются из функций, возвращающих другие функции; например, функция, добавляющая два целых числа, может иметь тип Integer -> Integer -> Integer, то есть Integer -> (Integer -> Integer) - функция, принимающая целое число и возвращающая другую функцию, которая сама принимает целое число и возвращает целое число. К счастью, вам не нужно слишком часто думать об этом в таких явных выражениях, иначе это очень запутанно!

...