第21讲: 偏函数(Partially applied function)实战详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第21讲: 偏函数(Partially applied function)实战详解相关的知识,希望对你有一定的参考价值。

偏函数,也叫部分应用函数,就是调用的时候,只传入函数的部分参数。先举个例子就很容易明白了。

object PartialAppliedFunction {
  def main(args: Array[String]): Unit = {
    val part_sum = sum(1,_:Int,3)
    println(part_sum(2))
  }
  
  def sum(a:Int,b:Int,c:Int)=a+b+c
}

我们定义了一个函数sum,共有3个参数。 我们又定义了一个函数part_sum,它依赖于sum函数,但是只有部分的参数是用了占位符代替。那么当我们调用part_sum时,只需传入sum的未传入的参数即可。

及 part_sum(2) == sum(1,2,3)

这个就叫作部分应用函数。


我们知道,在scala中函数是一等公民,函数可以当成变量赋值给其他的变量或者函数。

那么我们看看如下语句

scala> def sum(a:Int,b:Int,c:Int)=a+b+c
sum: (a: Int, b: Int, c: Int)Int

scala> val sum3 = sum
<console>:11: error: missing arguments for method sum;
follow this method with `_‘ if you want to treat it as a partially applied function
       val sum3 = sum
                  ^

直接将一个函数名称赋值给另一个变量,是会报错的。

其实我们想做的是:

scala> val sum3 = sum(_:Int,_:Int,_:Int)
sum3: (Int, Int, Int) => Int = <function3>

Scala提供了一个简单的写法

scala> val sum3 = sum _
sum3: (Int, Int, Int) => Int = <function3>

就是部分应用函数的特殊情况,所有的参数都应用。


在视频中老师举了一个例子:

object PartialAppliedFunction {
  def main(args: Array[String]): Unit = {
    val data = List(1,2,3,4,5)
    data.foreach(println _)
  }
}

其中

data.foreach(println _)

也是部分应用函数,开始时怎么也想不明白。这不是参数占位的写法嘛。其实这段代码应该这样理解

data.foreach() 应该传入一个函数作为参数 。 而 println _ 和sum _ 是类似的写法。 

参数占位应该是这样写:

data.foreach(println(_))


本文出自 “叮咚” 博客,请务必保留此出处http://lqding.blog.51cto.com/9123978/1741829

以上是关于第21讲: 偏函数(Partially applied function)实战详解的主要内容,如果未能解决你的问题,请参考以下文章

偏函数

十七.偏函数

python的偏函数

python偏函数

python 偏函数

python 之偏函数