2010-11-18 1 views
5

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

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

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

+0

См. Также http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

ответ

10

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

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

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

2

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

Смежные вопросы