Во многих случаях просто невозможно определить тип объекта. Самый простой случай - что-то вроде:
type A () = member x.bar () = ()
type B () = member x.bar () = ()
let foo x = x.bar () // Is x A or B?
Компилятор делает все возможное, поэтому, если он знает, какой тип во время использования, он с радостью позволит вам пропустить аннотации:
type A () = member x.bar () = ()
type B () = member x.bar () = ()
let blah (x: A) = x.bar ()
let foo x =
blah x
x.bar () // x is known to be A thanks to above line
Более подробное обсуждение можно найти в моем старом вопросе здесь: Почему вывод типов нецелесообразен для объектно-ориентированных языков?