【问题标题】:Difference between lifting and higher order functions提升和高阶函数之间的区别
【发布时间】:2017-04-25 03:24:54
【问题描述】:
当人们谈论map、fold 或bind 时,我通常会听到提升这个词,但基本上每个高阶函数不都是某种提升吗?
为什么filter 不能成为从a -> Bool 到[a] -> [a] 的提升,甚至bool 函数(它模拟一个if 语句)也可以被认为是从a -> a 到Bool -> a 的提升。如果不是,那么为什么 Applicative 类型类中的 ap 被视为提升?
如果重要的事情是从... a ... 到... f a ...,那么ap 也不适合这种情况:f (a -> b) -> f a -> f b
【问题讨论】:
标签:
functional-programming
lifting
【解决方案1】:
我很惊讶还没有人回答这个问题。
提升函数的作用是将函数提升到上下文中(通常是 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 的其他变体也定义为其他 arities。
这也是为什么filter 不是提升函数的原因,因为它不符合所需的类型签名;您没有将a -> bool 类型的函数提升到M[a] -> M[bool]。然而,它是一个高阶函数。
如果你想了解更多关于提升 Haskell Wiki 的信息,请联系 good article on it