2014-09-24 49 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))))。