2013-12-21 47 views
8

聽說在斯卡拉我可以使用_在匿名函數 「匿名參數」:爲什麼Scala不能推斷_的類型?

List(1,2,3).foreach(print(_)) 

但是這代碼不能編譯:

scala> def a[T](s: Seq[T]): Seq[T] = s.map(_) 
<console>:7: error: missing parameter type for expanded function ((x$1) => s.map(x$1)) 

,這可以:

scala> def a[T](s: Seq[T]): Seq[T] = s.map(x => x) 
a: [T](s: Seq[T])Seq[T] 

它似乎是類型推斷。但x => x怎麼能提供比_更多的信息?

回答

13

這裏的問題不是類型推斷。

你可以從錯誤消息等效代碼s.map(_)看到的不是,但這:

i => s.map(i) 

就像print(_)(實際上Predef.print(_))指i => Predef.print(i)

或者像"a" + _意味着"a".+(_)意味着s => "a".+(s)

這只是在目前的情況下沒有意義。

假設您有一個函數列表String => Stringfs),並且您想將所有這些函數應用於String列表。您可以使用此代碼:

fs.map{f => s.map(f)} 

或者只是這樣的:

fs.map{s.map(_)} 

增加:你可以使用identity方法,而不是如果x => x。它在默認情況下進口的,但你可以用它除了進口甚至更短的製造:

import Predef.{identity => id} 
List(1, 2, 3) map id 
// List[Int] = List(1, 2, 3) 

注意identity是一個衆所周知的名字,所以在團隊,你應該用它代替你的別名。

+0

+1對佔位符語法的直觀解釋。 –

0

似乎是類型推斷。但是,x => x如何提供比_更多的信息呢?

x => x是Function1的一種類型,它是map函數期望的參數。編譯器不能推斷出類型T的匿名變量_實際上是一個Function1。

相關問題