提升函数和高阶函数之间的区别
Difference between lifting and higher order functions
当人们谈论 map
、fold
或 bind
时,我通常会听到提升这个词,但基本上每个高阶函数不都是某种提升吗?
为什么 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
当人们谈论 map
、fold
或 bind
时,我通常会听到提升这个词,但基本上每个高阶函数不都是某种提升吗?
为什么 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
.
List
)
lift
还为其他参数定义了其他变体。
这也是 filter
不是提升函数的原因,因为它不符合所需的类型签名;您没有将 a -> bool
类型的函数提升为 M[a] -> M[bool]
。然而,它是一个高阶函数。
如果你想阅读更多关于提升 Haskell Wiki 有一个 good article on it