我有点困惑,需要有人来纠正我。让我们概述一下我目前的理解:
在哪里 E
是一个内仿函数,A
是一些类别:
E : A -> A.
由于 Haskell 中的所有类型和态射都在
Hask
类别,不是任何仿函数 在 Haskell 中还有一个 内仿函数 ? F : Hask -> Hask
.我有一种很好的感觉,我错了,并且以某种方式过度简化了这一点,我希望有人告诉我我是多么的白痴。谢谢。
最佳答案
您可能想澄清您是在询问“Haskell 中的仿函数”,还是 Functor
s。当在 Haskell 中使用类别理论术语时,并不总是很清楚所假设的类别。
但是,是的,默认假设是 哈斯克 ,它被认为是具有态射函数的 Haskell 类型的范畴。在这种情况下, 上的内仿函数 F哈斯克将任何类型 A 映射到类型 F(A) 并将两个类型 A 和 B 之间的任何函数 f 映射到某些类型 F(A) 和 F(B) 之间的函数 F(f)。
如果我们将自己限制为仅映射任何类型 a
的那些内仿函数到类型 (f a)
在哪里 f
是一个类型构造函数,类型为 * -> *
,那么我们可以将函数的关联映射描述为类型为 (a -> b) -> (f a -> f b)
的高阶函数,当然是类型类,叫做 Functor
.
然而,人们很容易想象 上表现良好的内仿函数。哈斯克不能(直接)写为 Functor
的实例,例如映射类型 a
的仿函数至Either a t
.虽然 中的仿函数显然没有多大意义哈斯克完全到其他类别,考虑 中的(逆变)仿函数是合理的。哈斯克至哈斯克同上。
除此之外,Functor
的实例必须从整个类别中映射哈斯克到它的某个子集上,因此也形成了一个类别。但是谈论 的子集之间的仿函数也是合理的。哈斯克 .例如,考虑一个发送类型 Maybe a
的仿函数。至[a]
.
您不妨细读 category-extras
package ,它提供了一些嵌入在 中的类别理论启发的结构。哈斯克而不是假设全部。
关于haskell - 所有 Haskell 仿函数都是内仿函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3273373/