In F#, it’s possible to write both object-oriented and/or functional programs. This means that a task that would be straight-forward in C++, defining an abstract interface containing overloaded methods, is also possible in F#. However, you have to get the syntax exactly right, otherwise you get obscure compiler errors which could mis-lead you into thinking it isn’t possible after all. For example, to use overloads, you must define multi-parameter methods using tuples.
type IBlog = abstract Write : DateTime * string * string -> IBlog abstract Write : string -> IBlog type MusingStudio = interface IBlog with member this.Write (entryDate : DateTime, subject : string, body : string) = // publish blog entry (this :> IBlog) member this.Write (subject : string) = // automatically generate body and publish (!) (this :> IBlog)
Note the syntax of the abstract method declarations carefully. As per this helpful post on StackOverflow, putting brackets around the tuple changes the signature and leads to confusing compiler errors:
type IBlog = abstract Write : (DateTime * string * string) -> IBlog // don't do this! abstract Write : string -> IBlog
Whilst it’s possible to implement the interface above and call into it, the syntax to do so involves additional brackets and is unnecessarily clunky. The syntax at the top of this article is preferable:
let blog = WordPress( "MusingStudio") :> IBlog// create blog blog .Write( "How to overload in F#" ) .Write( DateTime.Now, "Book Review: Make Me, Lee Child", "Is this the best Jack Reacher so far?")