功能集/应用方法

时间:2016-07-19 14:48:13

标签: scala

我刚刚开始学习Martin Odesky的Coursera课程中的scala。我真的在功能集问题上苦苦挣扎。我无法捕捉的是联合方法 -

object Functionalset {
  type Set = Int => Boolean
  def singletonSet(element: Int): Set = i => element == i
  def union(a: Set, b: Set): Set = i => a(i) || b(i)

  def main(args:Array[String]): Unit = {
    print(singletonSet(2)(4));
  }
}

在union方法中,我基本上返回一个函数,它接受Int i并调用a(i) || b(i)来检查i是否在集合中。 apply方法未在任何地方定义。 a(i)做了什么?它会调用singletonSet(element:Int):Set吗?如果是这样的话?

2 个答案:

答案 0 :(得分:1)

在本实验中,一个集合被定义为characteristic function。 这转化为:

type Set = Int => Boolean

这意味着Set只是一个函数接受Int并返回Boolean(这是Set的特征函数,一个oracle,它告诉给定的整数是否为在集合中或不)。

您的变量aSet,是一个函数Int => Boolean,因此如果a(i)i,则Int定义明确}。

两个联合的特征函数是一个函数,如果它的参数在两个集合之一中则返回true,否则返回false。

答案 1 :(得分:1)

  

a(i)做什么?它是否会调用singletonSet(element: Int)

不,这两种方法之间没有关系。在这种特殊情况下,a(i)只是调用函数a,这是一个从IntBoolean的函数。

a属于Set类型,是IntBooleanInt => Boolean的函数的类型别名用Scala语法糖)。

这样想:

def union(a: Int => Boolean, b: Int => Boolean): Int => Boolean = i => a(i) || b(i)

由于aFunction1[Int, Boolean]类型的函数,因此b是函数,因此调用a(i)只是调用带有i的传递值的函数。现在,可能令人困惑的是:

i => a(i) || b(i)

由于union本身会返回函数,因此可能会传入的任何未来Int需要占位符,这种情况发生在您致电singletonSet(2)(4),如果我们稍微贬低它,你有:

val intermidiateFunction: Int => Boolean = singletonSet(2)
val result: Boolean = intermidiateFunction(4)

将其视为方法的两步调用,当您执行第一次调用时,您将返回另一个函数,并且只有在第二次调用它时,才会返回结果生成的函数。

让我们调用union,看看会发生什么:

scala> union(i => i < 3, i => i > 1)
res6: Set = <function1>

scala> val result = union(i => i < 3, i => i > 1)
result: Set = <function1>

scala> result(1)
res7: Boolean = true

union要求我们传递两个函数,因此我们创建这些简化函数来检查Int是否小于3或大于1.第一次调用的结果本身就是一个函数。当我们现在将Int传递给结果时,例如:result(1),我们会检查1 < 3 || 1 > 1,这相当于a(i) || b(i),其中a 1}}是第一个函数,b是第二个函数。