hgi*_*sel 2 functional-programming lifting
我经常听到这个词的提升,当人们都在谈论map,fold或者bind,而不是基本上每个高阶函数某种提升?
为什么不能filter是从电梯a -> Bool到[a] -> [a],赫克甚至bool函数(型号if语句),可以考虑从电梯a -> a到Bool -> a.如果它们不是,那么为什么ap来自Applicative类型被认为是电梯?
如果重要的事情发生... a ...了... f a ...,那么ap也不适合这种情况:f (a -> b) -> f a -> f b
我很惊讶没有人回答过这个问题.
提升功能的作用是将功能提升到上下文(通常是Functor或Monad).因此,将类型函数提升a -> b到List上下文中会产生类型函数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])
Run Code Online (Sandbox Code Playgroud)
哪个M[a]是特定的Monad(比如List)用给定类型参数化a.
还有lift其他arities定义的其他变体.
这也是为什么filter不是提升功能,因为它不符合所需的类型签名; 你是不是升降式的功能a -> bool来M[a] -> M[bool].然而,它是一个更高阶的函数.
如果你想阅读有关解除Haskell的更多信息,Wiki上有一篇很好的文章