2011-07-27 20 views
19

Haskellで$のようにScalaで演算子の優先順位を強制する方法はありますか?例えば、Haskellで、あなたは

を持っている:

a b c = ((a b) c) 

a $ b c = a (b c) 

はScalaでこれを行うには同様の方法はありますか? Scalaには演算子自体はありませんが、同様の効果を得る方法はありますか?

答えて

15

infix vs。

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

名前は通常、これを利用するために明示的に選択することができます

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はまた、中置記法で使用される演算子のための固定された優先順序を持つ:表記法は、多くの場合、優先度を制御するために同様の方法で使用されています。たとえば、標準パーサライブラリの~^^です。

+0

説明を残していないファンタムのダウンローダによって再び追求されました...最も奇妙な –

+1

素敵なコードスニペット最初の1つ - 私はこれらのルールを思い出させるために便利です。ありがとう –

16

同様の効果を得るために暗黙的に使用することは可能です。例えば:名前がで終了する必要があるため、このシステムを利用し (未テストが、このようなものでなければなりません)

object Operator { 

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

} 

、あなたは、名前の$を使用することはできません:(結合性を修正する)とドルは通常の識別子(演算子の識別子ではない)なので、アンダースコアで区切らない限り、a:と同じ名前にすることはできません。

どのように使用しますか?このように:

val plusOne = (x: Int) => {x + 1} 
plusOne &: plusOne &: plusOne &: 1 
関連する問題