5

f# では、次のより簡潔な同等のものを探しています。

myNumber >= 2 && myNumber <= 4

のようなものを想像します

myNumber >=< (2, 4)

このような操作はありますか?

4

3 に答える 3

9

ジョンの答えはまさにあなたが求めていたものであり、最も実用的な解決策です。しかし、これにより、演算子を定義して、通常の数学表記に近い構文を有効にできるかどうか疑問に思いましたa <= b <= c

そのような解決策の 1 つを次に示します。

let inline (<=.) left middle = (left <= middle, middle)
let inline (.<=) (leftResult, middle) right = leftResult && (middle <= right)
let inline (.<=.) middleLeft middleRight = (middleLeft .<= middleRight, middleRight)

1 <=. 3 .<=. 5 .<= 9  // true
1 <=. 10 .<= 5   // false

これに関するいくつかのコメント:

  • 表情の「中」を表す.文字にしました
  • .は非常に慎重な選択であり、より好みの他のキャラクターに簡単に変更することはできません (たとえば、より良い見た目が好きな場合など1 <=@ 3 @<= 5)。 F# コンパイラは、演算子記号の最初の文字に基づいて、演算子の結合性や優先順位を変更します。標準の左から右への評価/短絡が必要であり.、これを有効にします。
  • 3 つの数値の比較は完全に最適化されますが、4 つ以上の数値の比較では、IL がタプルを割り当て、厳密には必要ではない他のさまざまな処理を実行します。

生成された IL

于 2013-07-30T01:25:13.513 に答える