// Standard pattern matching.
let Foo x =
match x with
| 1 ->
// ... lots of code, only evaluated if x == 1
| 2 ->
// ... lots of code, only evaluated if x == 2
// Standard pattern matching separated out, causing exception.
let Bar x =
let valueOne = //... lots of code, evaluated always. Exception if value <> 1.
let valueTwo = //... lots of code, evaluated always. Exception if value <> 2.
match x with
| 1 -> valueOne
| 2 -> valueTwo
「match」を使用したパターン マッチングでは、各パターンのコードが大きくなる可能性があります。上記のFooを参照してください。読みやすさを向上させるために、ブロックを個別の呼び出しとして分割する必要があります。
これに関する問題は、上記のBarのように、パターンが一致していなくても呼び出しが評価される可能性があることです。
- オプション 1: 遅延評価。
- オプション 2: 引数/パラメーターを転送します。
- オプション 3: 引数/パラメーターを転送し、アクティブなパターンを使用します。
各パターンのコードが大きくなる可能性がある場合に、読みやすさを改善するための推奨される方法は何ですか。または、問題に対する他の明白な解決策はありますか?
// ===== OPTION 1 =====
// Pattern matching separated out, lazy eval.
let Foo x =
let valueOne = lazy //... lots of code, evaluated on Force().
let valueTwo = lazy //... lots of code, evaluated on Force().
match x with
| 1 -> valueOne.Force()
| 2 -> valueTwo.Force()
// ===== OPTION 2 =====
// Pattern matching separated out, with arguments.
let Foo x =
let valueOne a = //... lots of code.
let valueTwo a = //... lots of code.
match x with
| 1 -> valueOne x
| 2 -> valueTwo x
// ===== OPTION 3 =====
// Active Pattern matching separated out, with arguments.
let Foo x =
let (|ValueOne|_|) inp =
if inp = 1 then Some(...) else None
let (|ValueTwo|_|) inp =
if inp = 2 then Some(...) else None
match x with
| ValueOne a -> a
| ValueTwo b -> b