1

に基づく:異なる引数数に対して同じ名前の演算子を定義することは可能ですか?

+ のような演算子を定義したいのですが-|-、たとえば、

let a = -|- 1
let b = 1 -|- 1
let c = 1 -|- 1 1 1 1

少なくとも最初の2行は機能し+ますが、このように独自の演算子を宣言するにはどうすればよいですか?

4

2 に答える 2

5

一般的にこれを行う簡単な方法はないと思います。inline静的メンバー制約を組み合わせた演算子を使用して、必要なケースのいくつかをカバーすることもできますが、あまりエレガントではないと思います。

ただし、一部の演算子名では、最初の2つのケースをカバーする個別のプレフィックスインフィックスのバージョンを定義できます。

// Prefix version of the operator (when you write e.g. '+. 10')
let (~+.) a = a * 10
// Infix version of the operator (when you write e.g. '1 +. 10')
let (+.) a b = a + b

// Sample use
+. 10
10 +. 20

10 +. 20 30 40オーバーロードされた中置演算子が必要になるため、まだ書き込むことはできません。

すべての演算子名に対してこれを実行できるわけではないことに注意してください。中置演算子に許可されている演算子名のF#仕様からの構文定義は次のとおりです。

infix-or-prefix-op:=
      +、-、+。、-。、%、&、&&

prefix-op:=
      infix-or-prefix-
      op〜 ~~ ~~~(および〜の繰り返し)
      !OP(!=を除く)

PS:私は一般的にカスタム演算子の大ファンではありません-場合によっては、それらは素晴らしいですが、それらを見つけるのは困難です(IntelliSenseには表示されません)。また、数値計算に標準の演算子を使用していない限り、それらが何を意味するのかを理解するのは難しいことがよくあります。だから私は多分他のアプローチを検討するでしょう...

于 2013-02-18T07:03:18.327 に答える
1

では、DiscriminatedUnionについてはどうでしょうか。

type RHS = 
|One of int
|Two of int * int
...

それから

let (-|-) a b =
    match b with
    |One(a) -> ...
    |Two(a,b) -> ...
     ...

それを呼び出す:

1 -|- One(1)
1 -|- Two(1,1)
....
于 2013-02-18T06:13:32.900 に答える