2017-02-13 66 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類型,讓我做一些挖掘,然後回覆你:) –