提升和高阶函数之间的差异

时间:2017-04-18 21:48:35

标签: functional-programming lifting

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

为什么filter无法从a -> Bool升级到[a] -> [a],即使是bool函数(对if语句进行建模)也可以认为是a -> aBool -> a。如果不是,那么为什么来自Applicative类型的ap被视为提升?

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

1 个答案:

答案 0 :(得分:5)

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

提升功能的作用是将功能提升到上下文(通常是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]是使用给定类型List参数化的某个特定Monad(如a)。

还为其他arities定义了lift的其他变体。

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

如果您想了解更多有关解除Haskell Wiki的信息,请good article on it