F#で文字列の先頭を一致させようとしています。それらを文字のリストとして処理する必要があるかどうか、また何をするかはわかりません。任意の提案をいただければ幸いです。
これが私がやろうとしていることの疑似コードバージョンです
let text = "The brown fox.."
match text with
| "The"::_ -> true
| "If"::_ -> true
| _ -> false
そこで、文字列の先頭を見て一致させたいと思います。文字列のリストでは一致しないことに注意してください。これは、私がやろうとしていることの本質を理解するために上記のように書いただけです。
パラメータ化 アクティブパターン が救い出します!
let (|Prefix|_|) (p:string) (s:string) =
if s.StartsWith(p) then
Some(s.Substring(p.Length))
else
None
match "Hello world" with
| Prefix "The" rest -> printfn "Started with 'The', rest is %s" rest
| Prefix "Hello" rest -> printfn "Started with 'Hello', rest is %s" rest
| _ -> printfn "neither"
パターンにガードを使用することもできます。
match text with
| txt when txt.StartsWith("The") -> true
| txt when txt.StartsWith("If") -> true
| _ -> false
はい、一致表現を使用したい場合は、それらを文字のリストとして扱う必要があります。
文字列を次のように変換するだけです。
let text = "The brown fox.." |> Seq.toList
次に、一致式を使用できますが、文字ごとに文字(リスト内の要素のタイプ)を使用する必要があります。
match text with
| 'T'::'h'::'e'::_ -> true
| 'I'::'f'::_ -> true
| _ -> false
ブライアンがパラメーター化されたアクティブパターンの方がはるかに優れていることを示唆しているので、いくつかの便利なパターン here (ページの最後に移動)があります。