Dela via


Adventures towards F# readability

Influenced by the sheer beauty of F# and the practicality of FsUnit, I decided to approach the concept of F# readability and more domain-oriented programming. For that I decided to program a small snippet, which pushes some element onto a stack of elements. However, instead of going with the usual, such as calling a function. which would eventually read like

 pushOnto(elem, stack)

I opted for something more readable. Luckily, hjgher order F# functions, i.e. functions that take parameters, which are themselves functions, come to the rescue, As you may see, from the snippet below:

 module Test

let onto s = s

type 'a Stack = 'a List

let EmptyStack = List.empty

let push a (ontostack:'a list -> 'a list) (st:'a list) =
    let pushx stack elem = 
        elem::stack
    pushx (ontostack st) a

let mutable myStack = EmptyStack

myStack <- push 'L' onto myStack 
myStack <- push 'O' onto myStack 
myStack <- push 'O' onto myStack 
myStack <- push 'C' onto myStack 

printfn "%A" myStack

printfn "press <any> key to exit"
System.Console.ReadLine() |> ignore

Capture

A call sequence like push <Element> onto <Stack>

reads much more natural than the function call presented above, or a variant like:

 elem |> push stack

Clearly, the stack example is trivial, but imagine cases like the ones covered by FsUnit or applications to scientific or any domain-specific computing. Instead of letting the technicality of the implementation language shine through, domain-specific concepts and abstractions can be implemented to such a degree that domain-savy experts my (unknowingly) use F# to solve complex business problems.

With that … read you later.