7

当人们谈论 , 或 时,我通常会听到提升这个词mapfoldbind基本上每个高阶函数不都是某种提升吗?

为什么不能filtera -> Boolto提升[a] -> [a],甚至bool函数(模拟 if 语句)也可以被认为是从a -> ato提升Bool -> a。如果不是,那么为什么apApplicative 类型的类被认为是电梯?

如果重要的是从... a ...to ... f a ...,那么ap也不适合这种情况:f (a -> b) -> f a -> f b

4

1 回答 1

15

我很惊讶还没有人回答这个问题。

提升函数的作用是将函数提升到上下文中(通常是 Functor 或 Monad)。因此,将 type 的函数提升a -> bListcontext 将导致 type 的函数List[a] -> List[b]。如果您考虑一下,这正是map(或fmap在 Haskell 中)所做的。事实上,它是 Functor 定义的一部分。

但是,Functor 只能提升一个参数的函数。我们还希望能够处理其他arities 的功能。例如,如果我们有一个a -> b -> c我们不能使用的类型函数map。这是更一般的起重操作出现的地方。在 Haskell 中,我们有一个lift2针对这种情况的:

lift2:: (a -> b -> c) -> (M[a] -> M[b] -> M[c])

在哪里用给定的类型参数化了M[a]一些特定的 Monad (like ) 。Lista

lift对于其他类型,还有定义的其他变体。

这也是为什么filter不是提升功能,因为它不符合所需的类型签名;您没有将类型功能提升a -> boolM[a] -> M[bool]. 然而,它是一个高阶函数。

如果你想阅读更多关于提升 Haskell Wiki 的文章

于 2017-04-24T19:24:54.753 回答