为什么静态箭头概括了箭头?

Why do Static Arrows generalise Arrows?

众所周知,Applicative 概括了 Arrows。在 Sam Lindley、Philip Wadler 和 Jeremy Yallop 的 Idioms are oblivious, arrows are meticulous, monads are promiscuous 论文中,据说 Applicative 等同于静态箭头,即以下同构成立的箭头:

arr a b :<->: arr () (a -> b)

据我了解,可以这样解释:

注:newtype Identity a = Id { runId :: a }.

Klesli Identity 是一个静态箭头,因为它环绕 k :: a -> Identity b。同构只是删除或添加包装器。

Kleilsi Maybe 不是静态箭头,因为 k = Kleisli (const Nothing) 存在 - 所有 f :: a -> b 对应于 Just . fk 没有位置同构。

但同时 Kleisli IdentityKleisli Maybe 都是 Arrow 实例。因此,我看不出泛化是如何工作的。

Haskell/Understanding Arrows tutorial on Wikibooks they say static morphism and note the following中:

Those two concepts are usually known as static arrows and Kleisli arrows respectively. Since using the word "arrow" with two subtly different meanings would make this text horribly confusing, we opted for "morphism", which is a synonym for this alternative meaning.

这是我迄今为止唯一的线索 - 我是否混淆了 Haskell Arrow 和箭头?

那么,这个层次结构是如何运作的?这个Applicative的属性怎么样formalised/proven?

我相信“概括”这个词会让您误入歧途。如果 k 是一个 Arrow,确实是这样:

  • k x 对于任何 x 将是 Applicative;
  • 特别是,k () 将是一个应用程序;
  • 然后可以将该应用程序重新旋转为等效的静态箭头(根据 Static from semigroupoidsStatic (k ()) a b ~ k () (a -> b)

然而,这个过程在一般情况下并不是无损的:静态箭头 Static (k ()) 不一定等同于我们开始的 k 箭头;不需要同构。换句话说,静态箭头不会泛化箭头。如果我们要定义 StaticArrow class,它将是 Arrow 的子class,而不是超级class.

P.S.: 在维基百科的引用中,措辞只是强调的问题。例如,虽然 Kleisli 箭头确实是 Hughes/Control.Arrow 箭头,但大多数时候当人们谈论“Kleisli 箭头”时,他们并不是在考虑 Arrow 实例,而只是在考虑它们是如何在一个类别,其中类别法则相当于某些单子的单子法则。特别是,这足以构成维基教科书中该段的讨论。