我知道Applicative
类在类别理论中被描述为“松散单曲面函子”,但我之前从未听说过“松散”一词,还有the nlab
page on lax functor一堆我不知道的东西我完全不认识,例如:双类别和我不知道我们在Haskell关心的事物。如果它实际上是关于双类别的,那么有人可以告诉我这是什么意思吗?否则,“松弛”用这个名字做什么?
答案 0 :(得分:17)
让我们切换到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))
对于 strict 单等子函子,unit
和mult
必须是同构。 “宽松”的影响就是放弃了这一要求。
例如,(直到通常的天真)(->) a
是严格单调的,而[]
只是松散的单调的。