有沒有什麼辦法可以強制Scala中的運算符優先級,就像你在Haskell中用$做的那樣?
例如,在Haskell中,您有:
a b c = ((a b) c)
和
a $ b c = a (b c)
有沒有類似的方式在Scala中做到這一點?我知道斯卡拉本身沒有運營商,但是有沒有辦法達到類似的效果?
有沒有什麼辦法可以強制Scala中的運算符優先級,就像你在Haskell中用$做的那樣?
例如,在Haskell中,您有:
a b c = ((a b) c)
和
a $ b c = a (b c)
有沒有類似的方式在Scala中做到這一點?我知道斯卡拉本身沒有運營商,但是有沒有辦法達到類似的效果?
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)
名稱通常可以選擇明確地利用這一點。例如,標準解析器庫中的~
和^^
。
可以使用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
斯卡拉已經定義了一個「管道」操作符,它的工作原理類似,但是有參數翻轉。看到switch function and object with scalaz' |>
由幽靈downvoter再次追求誰沒有留下任何解釋......最奇怪的 –
可愛的代碼片段,第一個 - 我會保持那個方便提醒自己這些規則。謝謝 –