Pattern matching on the beginning of a string in f#

F#Pattern Matching

F# Problem Overview


I am trying to match the beginning of strings in f#. Not sure if I have to treat them as a list of characters or what. Any suggestions would be appreciated.

Here is a psuedo code version of what I am trying to do

let text = "The brown fox.."

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

So, I want to look at the beginning of the string and match. Note I am not matching on a list of strings just wrote the above as an idea of the essence of what I am trying to do.

F# Solutions


Solution 1 - F#

Parameterized active patterns to the rescue!

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"

Solution 2 - F#

You could also use a guard on the pattern:

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

Solution 3 - F#

Yes you have to treat them as a list of characters if you want to use a match expression.

Simply transform the string with:

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

Then you can use a match expression but you will have to use chars (the type of elements in the list) for each letter:

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

As Brian suggest Parameterized Active Patterns are much nicer, there a some useful patterns here (go the end of the page).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJeffView Question on Stackoverflow
Solution 1 - F#BrianView Answer on Stackoverflow
Solution 2 - F#trgtView Answer on Stackoverflow
Solution 3 - F#StringerView Answer on Stackoverflow