2011-08-05 184 views
11

在斯坦福斯卡拉当然,我已经遇到了以下任务:斯卡拉设置功能

练习1 - 设置为功能:

在这个练习中,我们将代表从INTS到布尔台的功能:

type Set = Int => Boolean 

一个)写功能的“设置”接受一个int参数,并返回包含该诠释一个集。

b)编写一个函数“contains”,它将Set和Int作为参数,如果Int在Set中则返回true,否则返回false。

c)编写函数“union”,“intersect”和“minus”,它们以两个集合作为参数并返回一个Set。

d)你能写一个函数“子集”,它将两个集作为参数,并返回true,如果第一个是第二个子集,否则返回false?

一个bç是相当简单:

def set(i: Int): Set = n => n == i 

def contains(s: Set, i: Int) = s(i) 

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

def intersect(a: Set, b: Set): Set = i => a(i) && b(i) 

def minus(a: Set, b: Set): Set = i => a(i) && !b(i) 

但是是有d任何优雅的解决方案? 当然,严格来说,答案d是“是”,我可以写的东西,如:

def subset(a: Set, b: Set) = Int.MinValue to Int.MaxValue filter(a) forall(b) 

但这可能是不正确的做法。

+2

我认为*为*正道。 – Malvolio

+0

该课程与斯坦福大学没有任何关系 –

+0

@Seth从斯坦福大学的课程中,不是当前Coursera的课程,即使第二个任务几乎相同。请注意,它没有绑定/绑定提示,这btw回答了我的问题。 – Grozz

回答

9

我不认为这是可能的,如果没有迭代所有的整数。对于伪证据,看看所需的类型:

def subset: (a: Set, b: Set): Boolean 

不知怎的,我们必须产生Boolean当所有我们必须用Int => Boolean类型是一组(ab),以及整平等工作(Int, Int) => Boolean。从这些原语中,获得Boolean值的唯一方法是从Int值开始。由于我们手中没有任何特定的Int,唯一的选择是遍历所有这些。

如果我们有一个神奇的预言,isEmpty: Set => Boolean,故事会有所不同。

最后一个选项是编码“假”作为空集和“真”作为别的,从而改变了所希望的类型:

def subset: (a: Set, b: Set): Set 

通过这种编码,逻辑“或”对应到设定的联合操作,但我不知道逻辑“和”或“不是”可以很容易地定义。

0

我同意基普顿巴罗斯,你将不得不检查Ints的所有值,因为你想证明forall x, a(x) implies b(x)

关于它的优化,我可能会写:

def subset(a: Set, b: Set) = Int.MinValue to Int.MaxValue exists(i => !a(i) || b(i)) 

因为!a(i) || b(i)相当于a(i) implies b(i)

+0

从哪里获得该功能“存在”?它是在什么地方定义的,或者你没有定义它? –

+1

“Int.MinValue to Int.MaxValue”表达式创建了一个Range类型,它继承自IterableLike,TraversableLike,TraversableOnce,最后来自GenTraversableOnce,这是定义函数exists的地方。查看http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range –

+1

上的文档。谢谢,那一天,我似乎无视它是一个方法调用的范围内。 –

0

在Coursera练习后来有界引入集,然后FORALL()和存在()作为边界上的普遍量词和存在量词。 subset()不在练习中,但与forall相似。这里是我的版本的子集的():

// subset(s,p) tests if p is a subset of p returning true or false 
def subset(s: Set, p: Set): Boolean = { 
    def iter(a: Int): Boolean = { 
    if (a > bound) { true 
    } else if (contains(p, a)) { 
     if (contains(s, a)) iter(a + 1) else false 
    } else iter(a+1) 
    } 
    iter(-bound) 
} 
1

我们有

Set A = 
    Returns the intersection of the two given sets, 
    the set of all elements that are both in `s` and `t`. 

Set B = 
    Returns the subset of `s` for which `p` holds. 

没有设置相当于集合B

def filter(s: Set, p: Int => Boolean): Set = intersect(s, p) 
-1

如果有两套A和B那么A相交B是A和B的子集。数学证明:A∩B⊆A和A∩B⊆B.函数可以这样写: def filter(s:Set,p:Int => Boolean): Set = x => s(x)&(s:Set,p:Int => Boolean))()()xx xx xx xx xxx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx :设置=相交(S,p)

+0

虽然声明是正确的,但它不提供和回答问题。 – mins

+0

@mins答案由Ronak给出。我只想说两组交集是这两组中任何一组的集合。我也添加了确切的答案。 – Icoder

0

下面是使用它的另一个版本包含的功能:

def union(s: Set, t: Set): Set = x => contains(s,x) || contains(t,x) 

def intersect(s: Set, t: Set): Set = x => contains(s,x) && contains(t,x) 

def diff(s: Set, t: Set): Set = x => contains(s,x) && !contains(t,x) 

def filter(s: Set, p: Int => Boolean): Set = x => contains(s, x) && p(x)