Tel Asc
Но мне почему-то такая реализация контрАппликатива кажется более естественной:
class ContrApplicative f where
capp :: f (b -> a) -> (f a -> f b)
Но это уже совсем дичь какая-то...
Т.к. я для Op реализовать такой аппликатив пытался,но там вообще ничего не выходит...
Я кажется понял одну вещь...
Фри монаду лишь только для контрвариантных функторов(по крайней мере не для всех)не построить...
Давайте рассмотрим такой пример:
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
Мы уже воспользовались обычным функтором...