Word splitting / text parsing with consideration for quotes
I'm not saying the below revision is an improvement but it has eliminated the need for MoveNext. The penalty is to have the index as a separate argument to loop which violates the idea of a state object. One could argue that the index is not a part of the (splitting)state but just an iterator variable and then everything are nicely justified again :-)

module RevisedSplitting =

    type String with
        member this.charAt index =
            this.[index]

    type Quote = 
       | Single
       | Double
       | None

    type State = {
       Start : int
       Quote : Quote
       }

    let InitState = 
       {Start = 0; Quote = None }

    let FlipQuote s index (text : string) = 
       match text.charAt index, s.Quote with
       | '\'', None   -&gt; {s with Quote = Single}
       | '"' , None   -&gt; {s with Quote = Double} 
       | '\'', Single -&gt; {s with Quote = None}
       | '"' , Double -&gt; {s with Quote = None}
       | _ -&gt; s

    let StartNew s index = 
       {Start = index; Quote = None}

    let NotEmpty s =
       not (System.String.IsNullOrWhiteSpace(s))

    let GetToken s index text =
       (string text).Substring(s.Start, index - s.Start)

    let GetChar index (text : string) =
       sprintf "%c" (text.charAt index)

    let ExtractTokens (text : string) = 
       let rec loop index state = 
          seq {
             if index &lt; (text |&gt; Seq.length) then
                match text.charAt index, state.Quote with
                | '"' , _  
                | '\'', _     -&gt; yield! FlipQuote state index text |&gt; loop (index + 1)
                | ' ' , None   
                | '(' , None
                | ')' , None  -&gt; yield  GetToken state index text
                                 yield  GetChar  index text
                                 yield! StartNew state (index + 1) |&gt; loop (index + 1)  
                | _   , _     -&gt; yield! state |&gt; loop (index + 1)
             else
                yield GetToken state index text
          }
       loop 0 InitState |&gt; Seq.where NotEmpty