2011-07-27 27 views
19

有沒有什麼辦法可以強制Scala中的運算符優先級,就像你在Haskell中用$做的那樣?

例如,在Haskell中,您有:

a b c = ((a b) c) 

a $ b c = a (b c) 

有沒有類似的方式在Scala中做到這一點?我知道斯卡拉本身沒有運營商,但是有沒有辦法達到類似的效果?

回答

15

infix vs。符號通常以類似的方式用於控制的優先級:

a b c d == a.b(c).d 
a.b c d == a.b.c(d) 
a b c.d == a.b(c.d) 

Scala中還具有用於在綴表示法中使用運營商的固定優先排序:

(all letters) 
| 
^ 
& 
< > 
= ! 
: 
+ - 
*/% 
(all other special characters) 

名稱通常可以選擇明確地利用這一點。例如,標準解析器庫中的~^^

+0

由幽靈downvoter再次追求誰沒有留下任何解釋......最奇怪的 –

+1

可愛的代碼片段,第一個 - 我會保持那個方便提醒自己這些規則。謝謝 –

16

可以使用implicits實現類似的效果。例如: (未經測試,但應該是這樣的)

object Operator { 

    class WithOperator[T](that: T) { 
    def &:[U](f: T => U) = f(that) 
    } 
    implicit def withOperator[T](that: T) = new WithOperator(that) 

} 

使用這個系統,你可以不使用名稱$,因爲這個名字需要與終止:(固定關聯)和美元是一個正常的標識符(不是運營商標識符),所以你不能用同一個名字作爲:,除非你用下劃線分隔它們。

那麼,你如何使用它們?像這樣:

val plusOne = (x: Int) => {x + 1} 
plusOne &: plusOne &: plusOne &: 1