Idiomatic conditionals in F#
This is probably the way I would write it:

let stripLast punct word =
  match String.length word with
  | n when n &gt; 0 &amp;&amp; word.[n-1] = punct -&gt; word.[..n-2]
  | _ -&gt; word

let countWord (dictionary : Dictionary&lt;_,_&gt;) = function
  | null | "" -&gt; ()
  | word when blacklisted word -&gt; ()
  | word -&gt;
    match dictionary.TryGetValue(word) with
    | true, n -&gt; dictionary.[word] &lt;- n + 1
    | _ -&gt; dictionary.Add(word, 1)


Here's a rundown of the changes:

In stripLast:


Use String.length instead of a type annotation (punct can also be inferred)
Capture the length (which is used multiple times) using pattern matching
Check only the last char (LastIndexOf searches the whole string)
Use string slicing over Substring for conciseness


In countWord:


Allow the type args for Dictionary&lt;_,_&gt; to be inferred
Use pattern matching to clearly show the cases to be handled
Replace calls to ContainsKey and Item ([]) with one call to TryGetValue


A more functional approach, assuming you have a list of words, might be:

words 
  |&gt; Seq.countBy (stripLast stripChar)
  |&gt; Seq.filter (fun (word, _) -&gt;
    match word with
    | null | "" -&gt; false
    | _ -&gt; not (blacklisted word))