根据我的理解, Hask 类别的典型解释是该类别的对象是Haskell类型,而态射是Haskell函数。
有了这样的解释:
{-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-}
data Nat = Z | S Nat
type family Map (f :: Nat -> Nat) (x :: [Nat]) :: [Nat] where
Map f '[] = '[]
Map f (x ': xs) = (f x) ': (Map f (xs))
我们可以将Z
解释为Hask的单个对象子类别,将S a
解释为函子,将类别Z
映射到类别S Z
,并映射那个类别S(S Z)
等...
然后,以及类型级提升列表(例如),类型级仿函数(如Map
)将成为 Hask 的2类中的仿函数?
答案 0 :(得分:0)
您可以将此处的Map
视为从对象为Nat
类的对象的类别中提升箭头到对象为类型为[Nat]
的对象的类别。但这不是一个仿函数,因为它没有提供一种规范的方法来将Nat
的对象提升到[Nat]
的对象(并且有多个如何做到这一点)。
如果你有一个更通用的Map
镜像价值级别的东西,将类a -> b
的函数发送到种类[a] -> [b]
的函数,那么它会给出一个仿函数。
在任何情况下,2个类别都不会进入此图片。 2类别的工作方式是它们与普通类别一样,但它们也有箭头本身之间的映射,这些映射也以正确的方式组成。 (而较高的类别又有这些单元格之间的映射等)。因此,Hask
并不是一个2类别,因为我们的箭头之间没有特殊的地图。
旁注:虽然Hask
不属于2类,但它确实会产生相关联的一个,因为它本身就是丰富的"。在这个类别中,对象是" hask-enriched categories"。也就是说,其对象是你选择的任何类别,但其态射是haskell函数的类别 - 由例如haskell给出的hask的子类别。 []
,Maybe
等等都适用于此处。这类的态射是这种富含Hask的类别之间的函子。也就是说,它们将对象映射到对象,并且在对象之间的(haskell)函数与对象之间的(haskell)函数。所以这些对应于我们通常认为的函子之间的自然变换。现在我们需要在那些之间添加真正的2单元格的自然变换!也就是说,它们包括我们所认为的自然变换的态射和#34;在典型的Haskell中。
但这并不是我想象的那样。