I don't think you could model your original design in OO either, as EntityWholeNumber, EntityInteger, etc. do not share a common superclass, and so the return type of the "last" function is ambiguous.
To have a well-defined return type, you will need to create a new type, say SingleEntity that has a case for each of your entity types (equivalent to a superclass). Here's what I mean:
module EntitySeq=
type SingleEntity =
| WholeNumber of EntityWholeNumber
| Integer of EntityInteger
| Real of EntityReal
type EntitySeq =
| WholeNumberSeq of seq<EntityWholeNumber>
| IntegerSeq of seq<EntityInteger>
| RealSeq of seq<EntityReal>
let last x =
match x with
| WholeNumberSeq w -> WholeNumber (Seq.last w)
| IntegerSeq i -> Integer (Seq.last i)
| RealSeq r -> Real (Seq.last r)
This whole approach seems a bit over-constrained to me though.
Either a function is generic (in which case you really do not care what the type parameter is) or it isn't -- your EntitySeq is not a generic type, and so you should not expect to be able to create generic functions for it.
Personally, I would probably just use raw sequences and let the type checker ensure that everything matches up. :)