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.
的有用性
要回答您原来的问题,请注意上面的类型是 Semigroupoid
和 Category
classes:[=22= 中定义的更一般类型的特例]
id :: k a a
compose :: k b c -> k a b -> k a c
因为我们可以选择 k
作为函数箭头 (->)
。
在 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.
要回答您原来的问题,请注意上面的类型是 Semigroupoid
和 Category
classes:[=22= 中定义的更一般类型的特例]
id :: k a a
compose :: k b c -> k a b -> k a c
因为我们可以选择 k
作为函数箭头 (->)
。