パターンマッチ
値が特定のパターンに適合するか否かを判定する
パターンによって構造を分解することができる
match opt { パターン => 式 } を使う
code:rs
// Option型の値をSomeとNoneで場合分けする。Someの場合中身の値を取り出せる
let val = match opt {
Some(val) => val,
None => 1,
};
// Someにマッチするときだけ中身を取り出して実行する。if letでは網羅性検査がされない
if let Some(v) = opt {
println!("{}", v);
}
関数定義の引数部にパターンを記述できるのが特徴的
宣言的に条件分岐できる
code:hs
fact 0 = 1
fact n = n * fact $ n - 1
パターンマッチ式って case value of だっけ?
網羅性検査がなく、どれにもマッチしないと実行時エラー
match value with を使う
パターンマッチはプロポーザル段階
代入、引数部ではパターンマッチ的なことができる (分割代入)
code:js
const obj = { foo: 3 };
const { foo } = obj; // オブジェクトのプロパティ名でマッチ
// iterableの最初の要素にマッチする。長さ1の配列ではない
const head = (elem) => elem; conditional typesは型がextendsの右の型の部分型であるか否かで分岐する
条件部ではinferキーワードを使ってそこに来るであろう型を束縛できる
code:ts
type Head<T> = T extends infer Elem ? Elem : never; value match { case パターン => 式 } というmatch後置 なぜ?
code:scala
val list = List(1, 2, 3)
val head = list match {
//
// リストを先頭と残りに分解
case h :: _ => Some(h)
case _ => None
}
val str = "hogehoge"
str match {
// 型にパターンマッチ
case v: String => println(v.toUpperCase())
}