Skip to content

Instantly share code, notes, and snippets.

@forki
Created January 31, 2012 16:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save forki/1711508 to your computer and use it in GitHub Desktop.
Save forki/1711508 to your computer and use it in GitHub Desktop.
Mimic type classes with additional param
type 'a Num = {
zero: 'a
add: 'a -> 'a -> 'a
mult: 'a -> 'a -> 'a
fromInteger: int -> 'a }
let intNum = {
zero = 0
add = (+)
mult = (*)
fromInteger = id }
let floatNum = {
zero = 0.
add = (+)
mult = (*)
fromInteger = float }
let square (d: 'a Num) x = d.mult x x
let sumofSquares (d: 'a Num) values =
values
|> Seq.map (square d)
|> Seq.fold d.add d.zero
let sumOfSquaresForInts = sumofSquares intNum
let sumOfSquaresForFloat = sumofSquares floatNum
let r1 = sumOfSquaresForInts [1;2;3]
let r2 = sumOfSquaresForFloat [1.1; 2.2; 3.1]
// type error
// let r3 = sumofSquares intNum [1.1;2.2;3.1]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment