OCamlマニュアルのこのページでは、そのmatch
仕組みについて説明しています。
表現
match expr
with pattern1 -> expr1
| …
| patternn -> exprn
exprの値をパターンpattern1からpatternnに一致させます。patterniとのマッチングが成功すると、関連する式expriが評価され、その値がマッチ式全体の値になります。expriの評価は、マッチング中に実行されるバインディングによって強化された環境で行われます。複数のパターンがexprの値と一致する場合、一致式で最初に出現するパターンが選択されます。どのパターンもexprの値と一致しない場合、例外Match_failureが発生します。
つまり、一致するパターンが見つかるまで、次々とパターンを試します。完了すると、そのパターンに関連付けられた式(つまり、の右側の式)が返されます->
。一致するパターンがない場合は、例外が発生します。
マニュアルのこのページでは、どのようなパターンがあり、それらが何を意味するのかを説明しています。それは少し多いので、ここに関連するビットの要約があります:
最も重要なパターンは、可変パターンとバリアントパターンです。
変数パターンは単に変数名です。このパターンは常に一致し、一致した式をの右側にある指定された名前で参照できるようにします->
。名前の代わりにを使用することもできます_
。これも常に一致しますが、の右側の値を参照することはできません->
。
バリアントパターンは、バリアントタイプのコンストラクターの名前であり、コンストラクターが引数を取るのと同じ数のパターンが続きます。このパターンは、照合する値がその特定のコンストラクターを使用している場合、およびその値内の各要素が対応するパターンと一致する場合に一致します。
あなたの例では、最初のパターンは[]
です。list
これは、空のリストを表すタイプのコンストラクターです。コンストラクターは[]
引数を取りません。したがって、リストが空の場合、このパターンは一致します。
2番目のパターンはhead :: tail
です。空でないリストを表す型::
のコンストラクターです。コンストラクターは、リストの先頭と末尾の2つの引数を取りますlist
。およびは、コンストラクターのこれら2つの引数と一致する可変パターンです。したがって、このパターンは、リストが空でない場合に一致し、変数を割り当て、空でないリストの先頭と末尾にそれぞれ割り当てます。::
head
tail
::
head
tail