当应用 fmap 转换时,函子是否总是 return haskell 中的提升类型?

Does a functor always return a lifted type in haskell when the fmap transformation is applied?

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

你可以称之为提升的是类型构造函数Maybe为了构造类型Maybe Int而对类型Int所做的事情,以及fmap为了构造类型Maybe Int所做的事情一些 Int -> Int 类型的函数,以便构造 Maybe Int -> Maybe Int.

类型的函数

fmap 总是采用类型 a -> b 的函数,并为某些类型构造函数 f 提供类型 f a -> f b 的函数。因此,如果您将类型构造函数 f 的应用程序调用到类型 a "lifting",那么是的,fmap 总是为您提供一个适用于 "lifted types" 的函数.1

内置 Haskell 类型 class Functor 具有类型构造函数类型 * -> *:可以应用于您喜欢的任何类型的事物,以产生新类型(如示例中的 Maybe )。在范畴论术语中,类型构造函数本身(例如 Maybe)表示从源范畴的对象到目标范畴的映射,而 fmap 提供态射的映射(记住 Hask 类别有 Haskell 类型作为对象,Haskell 函数作为态射)。

因此 Haskell Functor 只能表示类别 Hask 上的内函子,因为将 Haskell 类型和函数映射到 Haskell 类型和功能。但它甚至不能表示任何可能的内函子,因为我们不能用它来任意映射对象(类型)。我的 Haskell 函子无法将 Int 映射到 Maybe String 并将 Char 映射到 Bool,它 必须 映射每种类型到类型构造函数下的 "the same type"(因为 MaybeInt 映射到 Maybe IntCharMaybe CharMaybe (Maybe (Maybe Bool))Maybe (Maybe (Maybe (Maybe Bool))),等等)。每个 Haskell 仿函数的目标类别都是嵌套在仿函数类型构造函数下的 Hask 的完整镜像。

所以 Haskell 的 Functor class 是范畴论函子一般概念的一个非常受限的版本,与 [=64 的概念相比甚至是非常受限的=].但是,如果我们专门讨论 Haskell 函子,那么是的,作为 fmap 结果的函数将始终 return (并采用) "lifted" 类型的值。


1 请注意 "lifting" 和 "lifted" 应用于 Haskell 中的事物在不同的上下文中有许多既定的含义,所以不要自动假设你看到的任何其他话题 "lifted types" 与本次讨论中的意思相同。