2014-09-30 51 views
1

我需要幫助這個:如何在scala數組集合中使用文字參數?

例如:

val myArray= Array(1, 2, 4, 5, -1, -7, 11, 29) 

我明白這一點:myArray.exists(_ < 0)

而且我也可以明白這一點:myArray.count(_ % 2 == 0)

,但我怎麼能在REPL寫這樣的:

myArray.forall(!xyz(_))  xyz is this _ % 2 == 0 like above 

我得到這個錯誤:

"error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.unary_$bang.$percent(2).$eq$eq(0(x$2))) 
       myArray.count(!_ % 2 ==0(_))" 

我有Eclipse 4.4。月神。

+0

可以顯示'xyz'的確切定義,請 – 2014-09-30 22:42:33

+0

我也想知道爲什麼出現錯誤中出現'myArray.count'。 – Kigyo 2014-09-30 22:43:50

+0

xyz is this _%2 == 0 – 2014-09-30 22:44:22

回答

0

通過使用_兩次要定義兩個參數的函數 - 和一個非常奇怪的一個是。編譯器告訴你,當它試圖派生兩個參數的類型時,它無法理解你的語句 - 這是不可能的。

在此之前的情況下是可能的,例如在

myArray.exists(_ < 0) 

編譯器知道存在於一個數組[INT]需要一個函數int爲BOOL。因此,代碼擴展到

myArray.exists((x : Int) => x < 0) 

在你的情況,你應該寫:

myArray.forall(_ % 2 != 0) 

另一種方法是

def xyz(n: Int) = n % 2 == 0 
myArray.forall(!xyz(_)) 

一個更好的錯誤信息會是這樣的「FORALL預計一函數Int => Bool here「。我認爲這是不可能的,因爲Scala中存在蘊含。您可以在Martin Oderskys Scala書的第8章中閱讀關於這些東西的更多信息。

1

讓我們來看看變化對你的例子之一:

myArray.count(!(_ % 2 == 0)) 

在這個片段中,因爲表達式_ % 2 == 0被括號括起來,編譯器解析它由一個匿名函數本身,而不是你所期望的整個!(_ % 2 == 0)

治療括號什麼是作爲一個函數,編譯器不知道來推斷哪種類型的佔位符。你可能會認爲你可以通過添加註釋解決這個問題,讓

myArray.count(!((_: Int) % 2 == 0)) 

但是,這不會工作,因爲你實際是在一元!運營商已創建的匿名函數!

要解決這個問題,你既可以簡化您的斷言......

myArray.count(_ % 2 != 0) 

...或完全消除佔位符。

myArray.count(n => !(n % 2 == 0)) 


編輯:儘管上述建議可能是解決問題的最佳方式,他們不直接處理當您輸入以下內容(無效)表達你收到錯誤消息:

myArray.count(!_ % 2 == 0(_)) 

這裏有兩個問題。首先是您的匿名函數_ % 2 == 0未包含在括號內,從而使編譯器相信整個表達式!_ % 2 == 0(_)是兩個變量的匿名函數。

如果我們總結我們在括號中的匿名函數,我們有

myArray.count(!(_ % 2 == 0)(_)) 

我們已經取得了進步,因爲編譯器不再找兩個參數,但它不能推斷佔位符的類型中嵌入式功能,所以我們必須註釋它。

最後,我們有

myArray.count(!((_: Int) % 2 == 0)(_)) 

可正常工作。這當然不像上面提到的解決方案那麼優雅,但它確實有效。

+1

看看錯誤消息:((x $ 1:,x $ 2)=> x $ 1.unary_ $ bang。$ percent(2)。$ eq $ eq(0(x $ 2)))。發生了一些與你描述不同的事情。 – uberwach 2014-10-01 09:03:31

+0

@uberwach你是對的。我剛剛編輯了我的答案以解決錯誤消息。 – Jawshooah 2014-10-01 16:10:27

相關問題