F# program to generate a Map of substrings frequencies
Fortunately you're already following the functional idioms entirely. So that's a very good thing.

The only things I would comment on are a few minor details:




let occurrence = (head :: other |&gt; Array.ofList |&gt; String)



Those parenthesis are superfluous.




let updatedMap = match occurrenceTable.ContainsKey (occurrence) with
                 | true -&gt; occurrenceTable.Add(occurrence, occurrenceTable.[occurrence] + 1.0)
                 | false -&gt; occurrenceTable.Add(occurrence, 1.0)



In this case, you have a lot of whitespace to the left of the match conditions, usually in this case  I just break the match to a new line and then work from there.

let updatedMap =
    match occurrenceTable.ContainsKey (occurrence) with
    | true -&gt; occurrenceTable.Add(occurrence, occurrenceTable.[occurrence] + 1.0)
    | false -&gt; occurrenceTable.Add(occurrence, 1.0)


It's generally easier to read.




let total = Map.fold (fun acc key value -&gt; acc + value) 0.0 occurrenceTable



I absolutely love to see fold used! I think it's far overlooked and definitely has many use cases.



In regards to this method:


let rec countOccurrences (input:string) (occurrenceTable:Map&lt;string, float&gt;) length = 



You nailed tail-call recursion. I would be willing to bet that if you looked at the IL for this code you would see a beautiful tail. call in there. Excellent work!



Overall, beautiful work. I think you did a phenomenal job with this code. :)