当应用 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"(因为 Maybe
将 Int
映射到 Maybe Int
、Char
到 Maybe Char
、Maybe (Maybe (Maybe Bool))
到 Maybe (Maybe (Maybe (Maybe Bool)))
,等等)。每个 Haskell 仿函数的目标类别都是嵌套在仿函数类型构造函数下的 Hask 的完整镜像。
所以 Haskell 的 Functor
class 是范畴论函子一般概念的一个非常受限的版本,与 [=64 的概念相比甚至是非常受限的=].但是,如果我们专门讨论 Haskell 函子,那么是的,作为 fmap
结果的函数将始终 return (并采用) "lifted" 类型的值。
1 请注意 "lifting" 和 "lifted" 应用于 Haskell 中的事物在不同的上下文中有许多既定的含义,所以不要自动假设你看到的任何其他话题 "lifted types" 与本次讨论中的意思相同。
假设我有一个 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"(因为 Maybe
将 Int
映射到 Maybe Int
、Char
到 Maybe Char
、Maybe (Maybe (Maybe Bool))
到 Maybe (Maybe (Maybe (Maybe Bool)))
,等等)。每个 Haskell 仿函数的目标类别都是嵌套在仿函数类型构造函数下的 Hask 的完整镜像。
所以 Haskell 的 Functor
class 是范畴论函子一般概念的一个非常受限的版本,与 [=64 的概念相比甚至是非常受限的=].但是,如果我们专门讨论 Haskell 函子,那么是的,作为 fmap
结果的函数将始终 return (并采用) "lifted" 类型的值。
1 请注意 "lifting" 和 "lifted" 应用于 Haskell 中的事物在不同的上下文中有许多既定的含义,所以不要自动假设你看到的任何其他话题 "lifted types" 与本次讨论中的意思相同。