【问题标题】:Difference between lifting and higher order functions提升和高阶函数之间的区别
【发布时间】:2017-04-25 03:24:54
【问题描述】:

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

为什么filter 不能成为从a -> Bool[a] -> [a] 的提升,甚至bool 函数(它模拟一个if 语句)也可以被认为是从a -> aBool -> 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 2012-04-25
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2020-09-09
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多