web-dev-qa-db-ja.com

f#の文字列の先頭でのパターンマッチング

F#で文字列の先頭を一致させようとしています。それらを文字のリストとして処理する必要があるかどうか、また何をするかはわかりません。任意の提案をいただければ幸いです。

これが私がやろうとしていることの疑似コードバージョンです

let text = "The brown fox.."

match text with
| "The"::_ -> true
| "If"::_ -> true
| _ -> false

そこで、文字列の先頭を見て一致させたいと思います。文字列のリストでは一致しないことに注意してください。これは、私がやろうとしていることの本質を理解するために上記のように書いただけです。

58
Jeff

パラメータ化 アクティブパターン が救い出します!

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"
92
Brian

パターンにガードを使用することもできます。

match text with
| txt when txt.StartsWith("The") -> true
| txt when txt.StartsWith("If") -> true
| _ -> false
17
trgt

はい、一致表現を使用したい場合は、それらを文字のリストとして扱う必要があります。

文字列を次のように変換するだけです。

let text = "The brown fox.." |> Seq.toList

次に、一致式を使用できますが、文字ごとに文字(リスト内の要素のタイプ)を使用する必要があります。

match text with
| 'T'::'h'::'e'::_ -> true
| 'I'::'f'::_ -> true
| _ -> false

ブライアンがパラメーター化されたアクティブパターンの方がはるかに優れていることを示唆しているので、いくつかの便利なパターン here (ページの最後に移動)があります。

12
Stringer