Methods in F#
F# supports methods defined on struct types, which are similar to classes in object-oriented programming.
open System
type Rect = { Width: int; Height: int }
// This 'area' method is defined as an extension method on the Rect type
type Rect with
member this.Area() =
this.Width * this.Height
// Methods can also be defined as standalone functions
// Here's an example using a value parameter
let perim (r: Rect) =
2 * r.Width + 2 * r.Height
[<EntryPoint>]
let main argv =
let r = { Width = 10; Height = 5 }
// Here we call the 2 methods defined for our struct
printfn "area: %d" (r.Area())
printfn "perim: %d" (perim r)
// F# automatically handles method calls on values
// There's no need for explicit pointer handling as in some other languages
let rRef = &r
printfn "area: %d" (rRef.Area())
printfn "perim: %d" (perim rRef)
0 // return an integer exit codeTo run the program:
$ dotnet fsi methods.fsx
area: 50
perim: 30
area: 50
perim: 30In F#, methods can be defined as extension methods (like Area) or as standalone functions (like perim). The language doesn’t distinguish between value and reference types in the same way as some other languages, so there’s no need for explicit pointer handling.
F# uses a different approach to object-oriented programming compared to some other languages. It favors immutability and functional programming paradigms, but still allows for object-oriented design when needed.
Next, we’ll look at F#’s mechanism for grouping and naming related sets of methods: interfaces.