Почему (->) по умолчанию не реализовано с Control.Monad.Instances - PullRequest
5 голосов
/ 18 ноября 2010

Я читал ЛЯ .Он говорит, что мне нужно явно загрузить Control.Monad.Instances, чтобы заставить работать следующий синтаксис:

( ( fmap (+5) ) (+5) ) 4

Почему это так?Почему, если функторы являются основной и объединяющей технологией, мне нужно явно загрузить Control.Monad.Instances, чтобы получить эту функциональность.Как (->) реализован без него (или просто скрыт и экспортируется только ->)?Почему использование fmap над типами функций не реализовано по умолчанию?

Ответы [ 2 ]

10 голосов
/ 18 ноября 2010

Здесь задействованы 3 различных понятия.Тип функции, класс типа Functor и «экземпляр» Functor.Тип функции (->) встроен в язык, и его существование и реализация полностью не связаны с Functor и fmap.Класс типа - это спецификация сигнатуры связанных с ней методов.«Экземпляр» является реализацией этой подписи.

Поэтому, чтобы сделать ваш вопрос более понятным, я бы перефразировал его как «почему экземпляр Functor для (->) не представлен в Prelude?»(Prelude является модулем, который находится в области действия по умолчанию).Как это в настоящее время сформулировано, это не имеет большого смысла.

Ответ на измененный вопрос прост: отчет по Haskell (официальная языковая спецификация, в которой указан интерфейс Prelude) нене включайте это.Возможно, так и должно быть, но язык и библиотеки на Haskell с тех пор сильно эволюционировали, и стандарты на Haskell, как правило, меняются медленно.В любом случае, правильно или неправильно, вот почему.

2 голосов
/ 18 ноября 2010

Функтор - это не языковая функция, это просто полезный класс типов, который случайно определяет случайный модуль.Чтобы использовать определение Functor для этого модуля, вы должны загрузить его, конец истории.

...