Почему (-›) не реализовано с Control.Monad.Instances по умолчанию

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

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

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


person Evan Carroll    schedule 18.11.2010    source источник
comment
См. также stackoverflow.com/questions /4204086/   -  person Don Stewart    schedule 03.05.2011


Ответы (2)


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

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

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

person mokus    schedule 18.11.2010

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

person jrockway    schedule 18.11.2010