2016-12-05 95 views
2

首先,這樣的:斯卡拉強調奇怪的行爲:錯誤:缺少參數類型擴展功能

"1 2".split(" ").toSet 

這:

Set("1", "2") 

兩個評價同一件事,即

res1: scala.collection.immutable.Set[String] = Set(1, 2) 

爲什麼然後,當我這樣做:

Set("1", "2") map (_.toInt) 

我得到預期的:

res2: scala.collection.immutable.Set[Int] = Set(1, 2) 

,但是當我這樣做:

"1 2".split(" ").toSet map (_.toInt) 

我:

<console>:12: error: missing parameter type for expanded function ((x$1) => x$1.toInt) 
    "1 2".split(" ").toSet map (_.toInt) 

我檢查和附加括號不解決問題。

+0

類型檢查器出錯了。如果你強制類型爲「String」,一切都會順利。嘗試'「1 2」.split(「」).toSet [String] map(_。toInt)' –

回答

1

使用toSet時類型推斷的原因,所以你需要有一個類型提示的連鎖調用或拆分調用。 你可以在這裏找到https://issues.scala-lang.org/browse/SI-7743細節,https://issues.scala-lang.org/browse/SI-9091

+1

對不起,但我認爲這是一個類型差異的問題。 'toSet'方法定義爲'def toSet [B>:A]:Set [B]'。所以,它接受所有至少是'String'的類型。超級類型的'String'沒有'toInt'方法,所以沒有問題。 –

+0

相當奇怪,我再說一遍,這些太表達式: ''1 2「.split(」「).toSet'和'Set(」1「,」2「)' 評估爲同樣的事情。 – GA1

+0

然而,如果你直接指定類型,它將起作用:「1 2」.split(「」).toSet [String] map(_.toInt) – Stan

0

的代碼應該是:

"1 2".split(" ").toSet map (x: String => x.toInt) 

在這裏,我明確地指定設置包含字符串。

鏈調用在Scala中有這個問題,編譯器期望您提供參數的類型。