サーチ…
備考
パターンマッチングは、複数の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 = 1
とx = 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"