假设我有一个Int
并且我fmap
使用作为函子应用转换Maybe
,我得到一个包装类型,即Maybe Int
. 那么我可以认为这是提升吗?如果是这样,仿函数是否总是返回提升的类型?
2 回答
您可以称之为提升的是类型构造函数Maybe
对类型执行Int
的操作以构造类型Maybe Int
,以及fmap
对某些类型的函数执行的操作Int -> Int
以构造类型的函数Maybe Int -> Maybe Int
。
fmap
总是接受一个类型的函数a -> b
,并给你一个类型的函数f a -> f b
,用于某些类型的构造函数f
。因此,如果您将类型构造函数的应用程序调用f
到类型a
“提升”,那么是的,fmap
总是为您提供一个适用于“提升类型”的函数。1
内置的 Haskell 类型类Functor
具有 kind 的成员类型构造函数* -> *
:可以应用于您喜欢的任何类型的东西,以生成新类型(就像Maybe
在您的示例中一样)。在范畴论术语中,类型构造函数本身(例如Maybe
)表示从源范畴的对象到目标范畴的映射,并fmap
提供态射的映射(请记住,Hask范畴有作为对象的 Haskell 类型和作为态射的 Haskell 函数)。
所以 HaskellFunctor
只能表示 Hask 类别上的endofunctors,因为将 Haskell 类型和函数映射到 Haskell 类型和函数。但它甚至不能表示任何可能的 endofunctor,因为我们不能用它来任意映射对象(类型)。我的 Haskell 仿函数不能映射Int
到Maybe String
和Char
到Bool
,它必须将每个类型映射到类型构造函数下的“相同类型”(如Maybe
映射Int
到Maybe Int
、Char
到Maybe Char
、Maybe (Maybe (Maybe Bool))
到Maybe (Maybe (Maybe (Maybe Bool)))
等)。每个 Haskell Functor 的目标类别是嵌套在 functor 的类型构造函数下的Hask的完整镜像。
因此,Haskell 的Functor
类是范畴论函子一般概念的相当受限的版本,与“Hask 上的内函子”的概念相比,甚至相当受限。但是,如果我们专门讨论 Haskell Functors,那么是的,作为结果的函数fmap
将始终以“提升”类型返回(并获取)值。
1请注意,在 Haskell 中应用于事物的“提升”和“提升”在不同的上下文中有许多既定的含义,所以不要自动假设你看到的任何其他关于“提升的类型”的意思与本文中的相同讨论。