2014-09-24 46 views
1
type Set = Int => Boolean 

    /** 
    * Returns whether all bounded integers within `s` satisfy `p`. 
    */ 
    def forall(s: Set, p: Int => Boolean): Boolean = { 
    def iter(a: Int): Boolean = { 
     if (a > bound) true 
     else if (contains(s, a) && !p(a)) false 
     else iter(a + 1) 
    } 
    iter(-bound) 
    } 

    /** 
    * Returns whether there exists a bounded integer within `s` 
    * that satisfies `p`. 
    */ 
    def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, (x => !p(x))) 

    /** 
    * Returns a set transformed by applying `f` to each element of `s`. 
    */ 
    def map(s: Set, f: Int => Int): Set = (x => exists(s, (y: Int) => f(y) == 
x)) 

所以这段代码。我不明白功能map在Scala中为内涵定义的集合实现映射

我看到它的输入是2个参数,这是设置和方法f。但是“身体”部分,我努力尝试,但仍然没有得到它。那是什么"y",以及为什么使用f(y)== x使它应用方法f来设置elemtns?

需要我的一些解释。 谢谢!

+2

你应该包括你的'Set'定义,否则这个问题对没有参加Scala Coursera的人来说是没有意义的;) – 2014-09-24 06:19:00

+0

解释我编辑问题的摘要:参见[intensional definition](https ://en.wikipedia.org/wiki/Intensional_definition)。 – 2014-09-24 06:27:34

+4

没有读过Coursera Honor Code,那么? – 2014-09-24 07:01:14

回答

5

要简洁:

如果你说:val set2 = map(set1, f)

然后set2(x)意志,当且仅当退出yset1f(y) == x

这正是exists(set1, y => f(y) == x)正在检查返回true。

换句话说,只有当您可以通过将f应用于set1的元素来获得它时,整数才是set2

0

什么是 “Y”

exists需要一个功能Int => Boolean作为第二个参数。这个函数是(y: Int) => f(y) == x,而y就是我们给它的参数的名字,和在x => !p(x)中一样。

以及为什么使用f(y)== x使它应用方法f来设置elemtns?

这个定义说:“xmap(s, f)exists(s, y => f(y) == x)成员现在考虑一个简单的例子:。s是一个功能x => (x == 1) || (x == 2)代表的集{1, 2}f = z => z + 1了它,然后我们有

s2 = map(s, z => z + 1) = x => exists(s, y => y + 1 == x) 

通过内联f定义为map。您可以检查:

  1. 2是s2的成员,即s2(2)exists(s, y => y + 1 == 2)exists(s, y => y == 1)true
  2. 0不是s2的成员,即s2(2)exists(s, y => y + 1 == 0)exists(s, y => y == -1)false

思考多一点,你应该能够列出s2所有成员,然后推广到任何sf

+0

这是FP中的“combinator”概念吗? – BufBills 2014-09-24 13:09:47

1

我们可以尝试通过向后应用来理解这段代码。

这里的map方法将返回true对于每一个给定x和功能f,如果x是应用于原始集合中的元素的功能f的结果。

它是通过检查,如果我们去了原来的地图和应用f在该地图上的每一个元素,其中至少有一个将等于x完成(这就是部分(x => exists(s, (y: Int) => f(y) == x))一样)。

关于exists本身,那就是如果我们在集合中的所有元素(使用forall法)给定的谓词p,为元件中的至少一个这样断言不会是虚假的陈述(这是部分!forall(s, (x => !p(x))))。