类型级仿函数只是Hask的2类中的仿函数吗?

时间:2014-11-11 22:11:21

标签: haskell category-theory

根据我的理解, 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类中的仿函数?

1 个答案:

答案 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中。

但这并不是我想象的那样。