"lax"在"lax monoidal functor"中是什么意思?
What does "lax" mean in "lax monoidal functor"?
我知道 Applicative
class 在范畴论中被描述为 "lax monoidal functor" 但我以前从未听说过 "lax" 这个词,并且 the nlab
page on lax functor 一堆我根本不认识的东西,回复:双类别和我不知道我们在 Haskell 中关心的东西。如果它实际上是关于双范畴的,有人能给我一个关于这意味着什么的普通观点吗?不然"lax"这个名字在干什么?
让我们切换到 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
必须是 同构 。 "lax" 的影响是放弃该要求。
例如,(达到通常的天真程度)(->) a
是严格单向的,但 []
只是松弛单向的。
我知道 Applicative
class 在范畴论中被描述为 "lax monoidal functor" 但我以前从未听说过 "lax" 这个词,并且 the nlab
page on lax functor 一堆我根本不认识的东西,回复:双类别和我不知道我们在 Haskell 中关心的东西。如果它实际上是关于双范畴的,有人能给我一个关于这意味着什么的普通观点吗?不然"lax"这个名字在干什么?
让我们切换到 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
必须是 同构 。 "lax" 的影响是放弃该要求。
例如,(达到通常的天真程度)(->) a
是严格单向的,但 []
只是松弛单向的。