提升函数和高阶函数之间的区别

Difference between lifting and higher order functions

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

为什么 filter 不能成为从 a -> Bool[a] -> [a] 的提升,甚至连 bool 函数(模拟 if 语句)都可以被认为是一个从 a -> a 提升到 Bool -> a。如果不是,那么为什么 Applicative 类型 class 中的 ap 被认为是提升?

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

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

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

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

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

其中 M[a] 是使用给定类型 a.

参数化的一些特定 Monad(如 List

lift 还为其他参数定义了其他变体。

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

如果你想阅读更多关于提升 Haskell Wiki 有一个 good article on it