1

假设我有一个Int并且我fmap使用作为函子应用转换Maybe,我得到一个包装类型,即Maybe Int. 那么我可以认为这是提升吗?如果是这样,仿函数是否总是返回提升的类型?

4

2 回答 2

1

您可以称之为提升的是类型构造函数Maybe对类型执行Int的操作以构造类型Maybe Int,以及fmap对某些类型的函数执行的操作Int -> Int以构造类型的函数Maybe Int -> Maybe Int

于 2017-04-05T07:01:30.427 回答
1

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 仿函数不能映射IntMaybe StringCharBool,它必须将每个类型映射到类型构造函数下的“相同类型”(如Maybe映射IntMaybe IntCharMaybe CharMaybe (Maybe (Maybe Bool))Maybe (Maybe (Maybe (Maybe Bool)))等)。每个 Haskell Functor 的目标类别是嵌套在 functor 的类型构造函数下的Hask的完整镜像。

因此,Haskell 的Functor类是范畴论函子一般概念的相当受限的版本,与“Hask 上的内函子”的概念相比,甚至相当受限。但是,如果我们专门讨论 Haskell Functors,那么是的,作为结果的函数fmap将始终以“提升”类型返回(并获取)值。


1请注意,在 Haskell 中应用于事物的“提升”和“提升”在不同的上下文中有许多既定的含义,所以不要自动假设你看到的任何其他关于“提升的类型”的意思与本文中的相同讨论。

于 2017-04-05T07:26:43.760 回答