问题描述
众所周知,类型为 Type -> Type
的类型构造函数(在 System F-omega 中)如果实现了函数 Functor
,则它只是一个 (a -> b) -> f a -> f b
。这是一个无法无天的函子,它也应该遵守函子定律(保留组合和身份)。所以带有 Type -> Type
的类型构造函数并不总是一个函子。但这只是关于类型范畴中的协变内函子。还有逆变函子和更多种类的函子。
我的问题:任何类型为 Type -> Type
的构造函数/函数是否都是某种(范畴论)合法函子(协变、逆变或其他类型)?
解决方法
是的,它始终是一个往返于 Haskell 类型的离散类别(只有标识箭头的类别)的函子。它为每个对象 a
分配一个对象 f a
。对于每个箭头(仅是恒等函数)f a -> f a
,我们自动有一个箭头 a -> a
,即恒等函数。由于唯一正在进行的组合是由自身组合而成的恒等箭头,因此这些定律是微不足道的。