在Category类中id成员的类型有什么意义?

时间:2016-07-27 16:11:02

标签: types purescript

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

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

a t t类型的含义是什么,以这种方式定义id背后的理由是什么?

1 个答案:

答案 0 :(得分:2)

我们可以在Haskell中定义函数组合和身份函数:

id :: a -> a
(.) :: (b -> c) -> (a -> b) -> a -> c

这很好。然而,还有其他东西看起来和行为像功能,我们想要定义组成和身份。它们遵循相同的规律,因此重用符号并在公共类型类中定义它们是有意义的。

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

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

要回答原始问题,请注意上述类型是SemigroupoidCategory类中定义的更一般类型的特例:

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

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