функторов(по крайней мере не для всех)не построить...
Давайте рассмотрим такой пример:
Free (b ->) a - как это развернется...
1.Как (b -> (b -> (b -> (... -> a))))
То есть мы накладываем друг на друга функторы и получаем функтор...
Если опираться на эту концепцию ,то напишем что-то подобное для контрвариантов:
2.(a -> (a -> (a -> (... -> b))))
Почему так?
Потому-что иначе никак:
Так не выйдет :
(((a -> b) -> b) -> b) -> ...
Это не будет контрвариантным функтором...
Так вот,давайте посмотрим,как сделать инстанс для контрвариантного функтора(вариант 2)).
Допустим для (a -> (a -> b))
contramap f =
fmap (contramap f). contramap f
Мы уже воспользовались обычным функтором...
вот эти вот b -> a -> b ... есть гиперфункции https://github.com/ekmett/hyperfunctions/blob/master/src/Control/Monad/Hyper.hs#L37
Обсуждают сегодня