文字列のOCaml関数パラメータパターンマッチング
Ocaml Function Parameter Pattern Matching
解決:
これは、文字列がリストと同じようにデータ型として表されないためです。したがって、cons(::)はコンストラクターですが、^は いいえ 。代わりに、文字列は再帰的定義のない下位レベルの型として表されます(リストのように)。 「explode」および「implode」と呼ばれるSML(OCamlで記述可能)の関数を使用して、文字列を文字のリストとして照合する方法があります。これらの関数は、それぞれ文字列を文字リストに、またはその逆に取得します。 。これらの実装例を次に示します。
Kristopher Micinskiが説明したように、リストの場合のようにパターンマッチングを使用して文字列を分解することはできません。
ただし、を使用してリストに変換できます爆発します。これがあなたの
を使用したパターンマッチングによる逆関数
爆発とその対応物
内破:
rec reverse str = explodestrを[]-> '' |と一致させます。 h :: t->リバース(tを内包)^ string_of_char h次のように使用します。
let()= let text = 'StackOverflow♥OCaml'in Printf.printf'Regular:%s n'text; Printf.printf '反転:%s n'(反転テキスト)これは、シングルバイト文字では機能しますが、マルチバイト文字では機能しないことを示しています。
そしてここに爆発してヘルパーメソッドと一緒にimplode:
let string_of_char c = String.make 1 c(*文字列を文字のリストに変換します*)let explode str = let rec explode_inner cur_index chars = if cur_index'' | h :: t-> string_of_char h ^(tを実装)
パターンマッチング式を作成する場合、パターンで任意の関数を使用することはできません。使用できるのは コンストラクター 、のように見えます 未評価 関数。たとえば、関数 '+'は整数で定義されています。だから表現1 + 2が評価され、3が得られます。関数 '+'が評価されるため、一致することはできませんx + y。これは、自然数がゼロかどうかをチェックする関数を定義する試みです。
f x = xを|と一致させます0-> false | a + 1-> true ;;これは機能しません!同じ理由で、文字列を使用した例は機能しません。関数 '^'は文字列で評価され、コンストラクターではありません。
のマッチングx + 1は、数値が未評価の演算子から作成された未評価の記号式である場合にのみ機能します+およびシンボリック定数1.これはOCAMLには当てはまりません。整数は、マシン番号を介して直接実装されます。
バリアント型と一致する場合、評価されていない式であるコンストラクターと一致します。例えば:
#f x = xを|と一致させますいくつかのx-> x + 1 |なし-> 0 ;; val f:intオプション-> int =これは、'オプション型は、次のような記号式で構成されます。いくつかのx。ここ、一部は評価されて他の値を与える関数ではなく、「コンストラクター」であり、決して評価されない関数と考えることができます。表現一部の3はこれ以上評価されません。そのままです。パターンマッチングできるのはそのような関数だけです。
リストは、コンストラクターから構築されたシンボリックで評価されていない式でもあります。コンストラクターは::。結果としてx :: y :: []は未評価の式であり、リストで表されます。[x; y]見た目の利便性のみ。このため、リストでパターンマッチングを行うことができます。