2017-02-13 58 views
-2

在组I型有型组和工会作用的迭代如下斯卡拉通过与条件

type Set = Int => Boolean 
def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e) 
val xs = Set(12001,12002, 12003, 12004) 
val ys = Set(13001,13002, 13003, 13004) 

当我使用union操作,

union(xs,ys) 

它应该返回我的另一个一套包含两套的所有元素xsys

编辑部分:

对不起,我是不是清楚我的问题,我有我自己的实现迭代器的两个集X和Y

var i = xs.iterator; 
while(i.hasNext) 
    println(i.next()) 

但我并不满足于此实施和发现你可以用函数实现条件(一些谷歌搜索后),但我无法让它在我的eclipse工作表中工作。

val rs = union(xs,ys)   //> rs : Learn2.Set = <function1> 

我猜测它返回一个函数。

所以我的问题, 1.是否有可能执行如上所述的编辑部分?如果是这样,那么我错过了什么让它工作? 2.我不知道如何在(e: Int) => s(e) || t(e)元素e的迭代中的元素都

+0

你的工会功能似乎很好。你会有什么困惑? –

+0

你的实际问题是什么? –

+0

你的建议听起来很对。 :-) – stefanobaghino

回答

2

看看你Set类型的集:Int => Boolean。所以需要Int并返回Boolean。这意味着它是而不是您可以迭代的集合来检索其所有值,因为它实际上不包含任何值。

如果你想知道什么Int值返回true那么你必须遍历可能的输入(或其一些子集)和过滤器,你要寻找的条件的整个范围。

scala> val res = union(xs,ys) 
res: Set = $$Lambda$1091/[email protected] 

scala> (0 to 20000).filter(res).foreach(println) 
12001 
12002 
12003 
12004 
13001 
13002 
13003 
13004 

scala> 

更新

你的困惑的事实,你已经在标准库中现有的集合来命名你的函数茎。 xs.itorator工作,因为xs而不是Set的一个例子,它是一个Set从标准库和所有相关的方法。将你的类型别名重命名为Xet,你会明白我的意思。

type Xet = Int => Boolean 
def union(s: Xet, t: Xet): Xet = (e: Int) => s(e) || t(e) 

val xx: Xet = _ == 12001 
val yx: Xet = _ == 13002 
val zx: Xet = union(xx, yx) 

xx.itrerator // Error, won't compile 
(1 to 20000).filter(zx).foreach(println) // output: 12001 & 13002 
+0

嘿,感谢您的更新。 我能够迭代我的设置,如下所示:var i = xs.iterator; while(i.hasNext)println(i.next())''但我无法让'union()'函数工作。我已经更新了我的问题,因为我不清楚。 –

+0

@RockwellSydney,看我的更新。 – jwvh

+0

是的,你是对的。我是新来的这个scala类型,让我做一些挖掘,然后回复你:) –