// 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
匹配在使用「匹配」,對於每個圖案的代碼可以是大的圖案匹配,見富上面,讓我想打出塊作爲分開呼叫以提高可讀性。分裂流出塊是爲了便於閱讀
與此相關的問題可能是,即使圖案不匹配,也會評估呼叫,如上面的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
我會使用一個活動模式,如果命名明智,他們很擅長解決這種類型的問題。 – s952163
假設不同的案例應該有不同的代碼,我只會使用函數而不是數值或'懶惰'。如果使用相同的代碼,則可以使用「活動模式」將不同情況合併爲單個匹配 – FuleSnabel