Перейдем к моноидальному виду Applicative
:
unit :: () -> f ()
mult :: (f s, f t) -> f (s, t)
pure :: x -> f x
pure x = fmap (const x) (unit ())
(<*>) :: f (s -> t) -> f s -> f t
ff <*> fs = fmap (uncurry ($)) (mult (ff, fs))
Для строгого моноидального функтора unit
и mult
должны быть изоморфизмы . Влияние "слабости" заключается в том, чтобы отбросить это требование.
Например, (до обычной наивности) (->) a
строго моноидален, но []
только слабо моноидален.