Category class 中id 成员类型的意义是什么?

What is the significance of the id member's type in the Category class?

在 PureScript 中,类别 class 在 Control.Category 中定义如下:

class Semigroupoid a <= Category a where
    id :: forall t. a t t

类型 a t t 表示什么,以这种方式定义 id 背后的基本原理是什么?

我们可以像 Haskell:

那样定义函数组合和恒等函数
id :: a -> a
(.) :: (b -> c) -> (a -> b) -> a -> c

这很好。然而,还有其他一些看起来和行为都像函数的东西,我们想为它们定义组合和身份。它们遵循相同的规律,因此重用符号并以通用类型定义它们是有意义的 class.

为什么这是一个有用的概括?一个例子是 monad 的 Kleisli 箭头。对于某些 monad,这些是 a -> m b 形式的函数。能够像函数一样组合这些东西是非常有用的,有时谈论一般性的组合很有用,无论是用于函数,Kleisli 箭头,还是其他一些类似函数的东西。

当与 purescript-profunctor 库中的 Strong class 配对时,Category class 变得更加有用。这是因为强profunctor 也是一个类别等同于Arrow。有大量现有文献记录了 Arrow class.

的有用性

要回答您原来的问题,请注意上面的类型是 SemigroupoidCategory classes:[=22= 中定义的更一般类型的特例]

id :: k a a
compose :: k b c -> k a b -> k a c

因为我们可以选择 k 作为函数箭头 (->)