在PureScript中,Category类在Control.Category中定义如下:
class Semigroupoid a <= Category a where
id :: forall t. a t t
a t t
类型的含义是什么,以这种方式定义id
背后的理由是什么?
答案 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
类的有用性。
要回答原始问题,请注意上述类型是Semigroupoid
和Category
类中定义的更一般类型的特例:
id :: k a a
compose :: k b c -> k a b -> k a c
因为我们可以选择k
作为功能箭头(->)
。