当人们谈论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
答案 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