moonmile solutions 分室

ソフトウェア開発者の情報収集をリアルタイムで垂れ流し...という具合に行きます。

本格的に F# の二項演算子(中置記法)を導入してみる(1)

Scala のメソッドの扱いが、func x y と x func y が同じなのは、二項演算子に文字列を使えるのではなくて「中置記法(infix notation)」とのこと。C# や F# でも (+) を op_plus に置き換えているのだが、一方向にしかできない。Scala の場合は、双方向に変換できるので等価性がある、ってことだろう。

現状の F# では、

let (+++) x y = x + y

のときに

x +++ y は可能

(+++)  x y はできない。

let plus x y = x + y

のときに

plus x y は可能

 x plus y はできない

となっている。これを両方可能にすれば ok. そうすると関数/メソッドも中置記法になるので「見かけ上、二項演算子のように見える」ことになる。

実際には Scala の infix notation は obj.method param の書き方を obj method param で書けるということなので、

member this.op x = this + x の時は

obj.op x と書くところを

obj op x と書けることになる。

よって、先の global な +++ と区別が必要なので、

member this.op x  = ... の場合には

obj op x と書く

static member this.op x y = ... の場合は(こんな書き方ができたかは後で)

x class.op y と書く

グローバルなところで

let op x y = ... と書いたら

x op y と書ける

の実装が必要になる。

 

これが他の F# の文法を阻害しないかどうかはもう少し検討が必要。