2011-01-22 47 views
8

這工作的結果:如何 「應用」 到一個無參數的功能

List(3, 1, 2).sorted apply 1 
res1: Int = 2 

而且這個工程:

var x = List(3, 1, 2).sorted 
x: List[Int] = List(1, 2, 3) 
x(1) 
res2: Int = 2 

但這並不:

List(3, 1, 2).sorted (1) 

error: type mismatch; 
found : Int(1) 
required: Ordering[?] 
     List(3, 1, 2).sorted (1) 
          ^

即使括號也不能解釋我想要的解析器:

(List(3, 1, 2).sorted)(1) 

error: type mismatch; 
found : Int(1) 
required: Ordering[?] 
     (List(3, 1, 2).sorted)(1) 

這似乎是一個自然的表達。我究竟做錯了什麼?

+1

`sorted`不是無參數:它需要一個隱式參數,您可以忽略它。這就是問題所在 - 你的(1)被解釋爲「sorted」的顯式參數,而不是其返回值的apply方法的參數,如在「List(1,2,3).tail(0)」中那樣工作正常。不幸的是,我不知道是否有任何解決方案。 – 2011-01-22 17:30:52

+0

你試過`List(3,1,2).sorted()(1)`? – Madoc 2011-01-22 18:30:11

+0

@Madoc:這不起作用,你不能通過提供一個空的參數列表來省略隱含的內容,編譯器會抱怨未指定的參數。 – 2011-01-22 19:00:24

回答

6

這工作:

(Listed(3, 1, 2).sorted _)(1)

,但我不知道它是否是更方便使用比:

Listed(3, 1, 2).sorted apply 1

反正我會去找後者。

5

我認爲你必須保持適用。是分類的原因是不是「無參數」,它被定義爲

def sorted [B >: A] (implicit ord: Ordering[B]) : List[A] 

由於這是一個隱含參數,訂貨[INT]通常是自動提供的,但如果你使用括號,編譯器認爲你想指定另一個Ordering [Int](比方說向後)。

3

所需的參數可以提供這樣說:

List(3, 1, 2).sorted(implicitly[Ordering[Int]])(1) 

雖然使用適用()看起來更短,那麼可怕。

2

最短的,你可以把它 - 沒有小的性能損失,但是 - 是

class Allow_\[A](a: A) { def \ = a } 
implicit def allowEveryone[A](a: A) = new Allow_\[A](a) 

scala> List(1,3,2).sorted\(1) 
res0: Int = 2 

如果你能接受另一個字符,這可能是更好:<>看起來像括號反正,並能被認爲是「請像往常一樣填寫隱含參數」:

class Allow_<>[A](a: A) { def <> = a } 
implicit def allowEveryone[A](a: A) = new Allow_<>[A](a) 

scala> List(1,3,2).sorted<>(1) 
res0: Int = 2 
相關問題