История изменений
Исправление qnikst, (текущая версия) :
Начну конца, без функтора можно, есть мономорфный по структуре map :: (a-> b) -> a -> b
. fmap
можно назвать его обобщение на любую структуру (в мат. смысле) являющуюся фуктором (на самом деле наоборот map это специализация fmap на списки). Конечно все эти fmap выглядят странно, но тут нужен компромисс, если интересно, то смотри обсуждение foldable traversable proposal в теме про ghc ссылка есть.
Теперь про функторы и их сложность, в упрощенном смысле их можно рассматривать как контейнер (в смысле структуры даннвх) или контекст вычисления, который «захватывает» особенности вычисления будь то эффекты или прочие свойства (напр. Identity не делает ничего :)). Функтор должен иметь операцию применения fmap, которая применяет значение к значению внутри контекста сохраняя его (контекста) структуру, напр. поэтому список это функтор, а множество - нет. Т.е. если у тебя есть контекст (список, maybe, величина с погрешностью, jquery), то ты можешь проверить есть ли у него требуемая операция и дальше ты минимум сможешь применять к нему всякие полиморфные функции, или использовать во всяких композициях, как в lens (см. как линзы строятся). К сожалению, простых и наглядных примеров для второго у меня не подготовлено, т.к. ни преподаванием ни консультациями особо не занимаюсь.
Как-то так.
Исходная версия qnikst, :
Начну конца, без функтора можно, есть мономорфный по структуре Теперь про функторы и их сложность, в упрощенном смысле их можно рассматривать как контейнер (в смысле структуры даннвх) или контекст вычисления, который "захватывает" особенности вычисления будь то эффекты или прочие свойства (напр. Identity не делает ничего :)). Функтор должен иметь операцию применения fmap, которая применяет значение к значению внутри контекста сохраняя его (контекста) структуру, напр. поэтому список это функтор, а множество - нет. Т.е. если у тебя есть контекст (список, maybe, величина с погрешностью, jquery), то ты можешь проверить есть ли у него требуемая операция и дальше ты минимум сможешь применять к нему всякие полиморфные функции, или использовать во всяких композициях, как в lens (см. как линзы строятся). К сожалению, простых и наглядных примеров для второго у меня не подготовлено, т.к. ни преподаванием ни консультациями особо не занимаюсь. Как-то так.map :: (a-> b) -> a -> b
. fmap[ /inline] можно назвать его обобщение на любую структуру (в мат. смысле) являющуюся фуктором (на самом деле наоборот map это специализация fmap на списки). Конечно все эти [b]f[/b]map выглядят странно, но тут нужен компромисс, если интересно, то смотри обсуждение foldable traversable proposal в теме про ghc ссылка есть.