Из функторов, которые не являются аппликативными:
Конструктор типа, который является Functor, но не Applicative. Простым примером является пара:
instance Functor ((,) r) where fmap f (x,y) = (x, f y)
Но нет способа определить его экземпляр
Applicative
без наложения дополнительных ограничений наr
. В частности, нет способа определитьpure :: a -> (r, a)
для произвольногоr
.
Здесь pure
невозможно определить для всех типов одновременно; однако для любого бетона типа T
можно сделать ((,) T)
аппликативом.
Вопрос. Существует ли пример конкретного функтора (т. е. без задействованных переменных типа), который является функтором, но не аппликативным?
T
можно сделать((,) T)
аппликативным — не совсем так. Вам по-прежнему нужно, чтобыT
был моноидом, и не только из-заpure
: вам также нужно реализовать(<*>)
таким образом, чтобы два метода следовали аппликативным законам. - person duplode   schedule 23.05.2017T
, и тогда((,) T)
будет конкретным функтором, который не может быть аппликативным? - person George   schedule 23.05.2017T
его в принципе можно сделать членомMonoid
, а затем в принципе можно сделатьApplicative
. Что не так с этим рассуждением? - person George   schedule 23.05.2017Dead
из этот ответ тем, что вы ищете? Дополнительных переменных типа нет... - person Alec   schedule 23.05.2017(a -> Int) -> Maybe a
являетсяFunctor
(т.е. как вы определяетеfmap
)? - person Tom   schedule 16.01.2019deriving Functor
должен делать это автоматически. Этот конструктор типа используетa
в ковариантных позициях, так что это явно функтор. Экземпляр функтора можно построить механически. Если вы видите, как(a -> Int) -> Int
иz -> Maybe a
реализуют своиfmap
, вы легко поймете, что здесь делать. - person winitzki   schedule 17.01.2019f :: a -> b
и функцииb -> Int
их можно скомпоновать, чтобы получить функциюa -> Int
. Учитываяx :: (a -> Int) -> Maybe a
, можно применить его к результату и получитьMaybe a
, который затем можно сопоставить, используяfmap
Maybe
, сMaybe b
, то естьfmap f x = \g -> fmap f (x (g . f))
. - person Tom   schedule 18.01.2019<*>
реализация для этого типа не может удовлетворять законам. - person Tom   schedule 18.01.2019zip : F a -> F b -> F (a,b)
, чем<*>
. Теперь нам нужно реализоватьzip : ((a -> Z) -> Maybe a)) -> ((b -> Z) -> Maybe b) -> ((a, b) -> Z) -> Maybe (a, b)
. Но функция с этой сигнатурой типа может возвращать толькоNothing
, потому что невозможно вычислить пару(a, b)
(у нас не может быть значения типаa -> Z
илиb -> Z
, у нас есть только(a, b) -> Z
). Так что это единственная реализация. Однако методzip
, который всегда возвращаетNothing
, будет нарушать законы тождества для аппликативных функторов. - person winitzki   schedule 19.01.2019