основе (раздел 7) laws for Monoidal
Макбрайд и Патерсона я бы SuG gest следующие законы для liftA2
и pure
.
левый и правый тождественное
liftA2 (\_ y -> y) (pure x) fy = fy
liftA2 (\x _ -> x) fx (pure y) = fx
ассоциативность
liftA2 id (liftA2 (\x y z -> f x y z) fx fy) fz =
liftA2 (flip id) fx (liftA2 (\y z x -> f x y z) fy fz)
естественность
liftA2 (\x y -> o (f x) (g y)) fx fy = liftA2 o (fmap f fx) (fmap g fy)
Это не сразу видно, что они являются достаточными для покрытия связи между fmap
и Applicative
«с pure
и liftA2
. Давайте посмотрим, если мы сможем доказать, из приведенных выше законов,
fmap f fx = liftA2 id (pure f) fx
Мы начнем работать над fmap f fx
. Все перечисленные ниже эквивалентны.
fmap f fx
liftA2 (\x _ -> x) (fmap f fx) ( pure y) -- by right identity
liftA2 (\x _ -> x) (fmap f fx) ( id (pure y)) -- id x = x by definition
liftA2 (\x _ -> x) (fmap f fx) (fmap id (pure y)) -- fmap id = id (Functor law)
liftA2 (\x y -> (\x _ -> x) (f x) (id y)) fx (pure y) -- by naturality
liftA2 (\x _ -> f x ) fx (pure y) -- apply constant function
На данный момент мы написали fmap
с точки зрения liftA2
, pure
и любой y
; fmap
полностью определяется вышеуказанными законами. Остальная часть еще не доказанного доказательства остается нерешительным автором как упражнение для определенного читателя.
'liftA2' определяется в терминах' <$> 'и' <*> ', я не знаю, почему вы хотите вместо этого определить' <*> 'в терминах' liftA2'. – bheklilr
Да, но я хотел бы сделать что-то похожее на то, что делает EZ Yang в своем посте, сравнивая аппликативные и моноидальные: http://blog.ezyang.com/2012/08/applicative-functors/ –
'Applicative' с' pure 'и' liftA2' совпадает с классом ['Monoidal'] (http://www.haskellforall.com/2014/07/equational-reasoning-at-scale.html), который имеет список законов. Чтобы перейти от «Monoidal» к «Applicative» с 'pure' и' liftA2', вы замените явные типы и конструкторы в интерфейсе на то, что тип или конструктор может быть передан для восстановления исходного интерфейса] (http: // stackoverflow.com/a/27262462/414413). – Cirdec