scala coursera功能编程分配FunSets

时间:2017-12-22 15:21:39

标签: scala functional-programming purely-functional

我已经接受了马丁·奥德斯基在课程中的scala中的函数式编程课程。
但是,我无法理解第二个Assignment Funsets.scala的解决方案。

type Set = Int => Boolean

  /**
   * Indicates whether a set contains a given element.
   */
  def contains(s: Set, elem: Int): Boolean = s(elem)

  /**
   * Returns the union of the two given sets,
   * the sets of all elements that are in either `s` or `t`.
   */
  def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)

问题在上面的功能中,什么是e ?它从何而来 ?我知道union函数结合了两个集合,但是我从方法定义中理解的是它需要2个集合作为输入并返回结果集合,那么 e 来自哪里?< / p>

  /**
   * Returns the intersection of the two given sets,
   * the set of all elements that are both in `s` or `t`.
   */
  def intersect(s: Set, t: Set): Set = (e: Int) => s(e) && t(e)

同样的问题适用于交叉函数。
请任何人解释一下上述两个函数的操作,即这两个陈述

(e: Int) => s(e) || t(e)(e: Int) => s(e) && t(e)

4 个答案:

答案 0 :(得分:2)

def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)

让我们把它分解成小块。

  • def union()我正在定义一种方法,我会调用union
  • (s: Set, t: Set)此方法将采用我称之为st的2个参数,类型为Set
  • : Set此方法将返回类型Set的值。坚持......什么是Set
  • type Set = Int => Boolean啊,好的,Set是一个以Int为参数并返回Boolean的函数。得到它了。返回union()方法。
  • (e: Int) => s(e) || t(e)这是一个采用Int类型的单个参数的函数。我打算调用该参数e。当此功能收到Int时,它将被同时提供给stst都是Set类型,这意味着在投放Int时,它们会返回Boolean。那么我们就会有2 Boolean个值,他们会一起生成一个Boolean,它与Set的定义相匹配( Int in Boolean,所以我们已经完成了。

现在让我们创建一个示例,看看如何使用它。

val setA:Set = x => x == 5   //this Set is true only for 5
val setB:Set = y => y == 2   //this Set is true only for 2
val setU = union(setA, setB) //setA is parameter s, setB is parameter t

setU(2)  //'e' is now 2, this returns true
setU(5)  //'e' is now 5, this returns true
setU(25) //'e' is now 25, this returns false

答案 1 :(得分:1)

如视频讲座中所述,我们应该将一个匿名函数分配给基本函数。

在这里,(x:Int)不是从某处带来的,请将其视为其他函数的函数参数。 例如:

def num(s: FunSet): FunSet = (x: Int) => x

this is similar to, 
def function(x: Int) = x

def num(s: FunSet): FunSet = function

我希望这对将来的学习者有帮助...!我也有这个疑问...

答案 2 :(得分:0)

e被称为参数。当函数应用于参数时,参数将绑定到参数

例如,在函数

val f: Int ⇒ Int = i ⇒ i + 1

i是一个参数。如果将f引用的函数应用于参数,比如2,那么在函数内部,i绑定到参数的值,即在函数内部,取消引用{ {1}}评估为i。因此,应用2引用的函数将评估为f

3

答案 3 :(得分:0)

请记住在此作业中如何定义Set:它只是一个采用Int并返回Boolean的函数。将Int传递给此函数时,如果Int位于Set,则函数返回true,否则返回false。换句话说,这种类型的Set实际上并不是一个集合,而是对给定Set中某些内容的含义的定义。

现在,在两个union之间调用Set会怎么做?那么它产生Set,其成员至少在这两个Set中的一个中。请记住,Set只是Int => Boolean函数,因此:

(e: Int) => s(e) || t(e)

是一个函数,它接受一些Int参数,称之为e,如果E s(e)为真,则返回true或t(e)为真。根据{{​​1}}方法声明,unions是什么?

t

def union(s: Set, t: Set):是描述s是否在Int Set内的FUNCTION;同样适用于s。因此,t表示s(e) || t(e)必须位于e个中的一个或两个中,因为两个Set中的union才能返回true - 这正是Set的定义是什么。