サーチ…


備考

パターンマッチングは、複数のif / else if / elseスタイルステートメントを使用するのと比較して、分岐を非常に簡潔に処理できることが多いので、多くの関数言語の強力な機能です。しかし、十分なオプションと「いつ」のガードが与えられても、パターンマッチングは冗長で一目でわかりにくくなることがあります。

これが起こると、F#のアクティブパターンは、一致するロジックに意味のある名前を付ける素晴らしい方法となり、コードを単純化し、再利用も可能にします。

マッチングオプション

オプションを処理するには、パターンマッチングが便利です。

let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"

ドメイン全体がカバーされるパターンマッチングチェック

let x = true
match x with
| true -> printfn "x is true"

警告を発する

C:¥Program Files(x86)¥Microsoft VS Code¥Untitled-1(2,7):警告FS0025:この式で不完全なパターンが一致します。例えば、値「偽」は、パターンによってカバーされないケースを示すことができる。

これは可能なブール値のすべてがカバーされていないためです。

boolは明示的にリストすることができますが、intはリストするのが難しい

let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"

ここでは特殊な_文字を使用します。 _は他のすべての可能な場合に一致します。

_があなたを困らせることができる

私たちが自分で作るタイプを考えてみましょう。

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

私たちは、次のようなエクスクエストションで試合を書くかもしれません

match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"

上記のコードは意味があります。もしあなたが冷静ではないと思っているなら、私たちは_

後でこのコードにリファクタリングします

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

F#コンパイラは、私たちに警告を与え、私たちのマッチ表現をリファクタリングして、人に治療を依頼させるよう促します。代わりに、マッチ式は無意識の人を静かに扱います。要するに、ロジックエラーを避けるために可能な場合には、明示的にケースをリストアウトすることを選択する必要があります。

ケースは上から下に評価され、最初の試合が使用されます

不適切な使用法:

次のスニペットでは、最後の一致は決して使用されません。

let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"

プリント

xは上記に挙げられていないものです

正しい使用法:

ここでは、 x = 1x = 4両方が固有のケースに当たるが、それ以外はすべてデフォルトのケース_

let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"

プリント

xは4

ガードが任意の条件を追加できるようになると

type Person = {
    Age : int
    PassedDriversTest : bool }

let someone = { Age = 19; PassedDriversTest = true }

match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow