hl7 parser with fparsec
I am not really familiar with Fparsec, but a few of your functions could be simplified, or written better:

For example : 

let pcomp = sepBy pHl7Element (pchar '&amp;') |&gt;&gt; (fun vals -&gt; List.mapi (fun i s -&gt; {value = s; position = i}) vals)


Using partial application, it could be written as :

let pcomp = sepBy pHl7Element (pchar '&amp;') |&gt;&gt; (List.mapi (fun i s -&gt; { value = s; position = i }))


And the one after it: 

// Before
let pfield = sepBy pcomp (pchar '^') |&gt;&gt; (fun comps -&gt; List.mapi (fun i c -&gt; {subcomponents = c; position = i}) comps)
// After
let pfield = sepBy pcomp (pchar '^') |&gt;&gt; (List.mapi (fun i c -&gt; { subcomponents = c; position = i }))


Also, (fun x -&gt; x) could be simply replaced by id. 

let pheader = anyString 3 |&gt;&gt; id


On other matters, there is a potential bug in your code : in your pRepsOrField function, you're matching field.Length with 0 then extracting the first item, which will crash your code. Using the Length property to find out the length is .. unusual. You don't even need it. Pattern matching with lists based on length in F# is usually done this way:

match fields with
| [] -&gt; // do something
| [ c ] -&gt;  SingleField { components = c; position = 0 }
| _ -&gt; Repetitions(List.mapi (fun i c -&gt; { components = c; position = i }) fields))


Now you don't have to use extra methods/properties to get the length and and the first item. It is all right there ...