type SumOperations = SumOperations
let inline getSum b = SumOperations &+ b
static member inline (&+) (h:'h, x : int ) = x
static member inline (&+) (h:'h, xl : 'x list) = xl |> List .sumBy ((&+) h)
static member inline (&+) (h:'h, xa : 'x [] ) = xa |> Array.sumBy ((&+) h)
static member inline (&+) (h:'h, xy : 'x * 'y ) = match xy with x, y -> ((&+) h) x + ((&+) h) y
static member inline (&+) (h:'h, xo : 'x option) = match xo with Some x -> ((&+) h) x |_-> 0
2 |> getSum |> printfn "2 = %d"
[ 2 ; 1 ] |> getSum |> printfn "[ 2 ; 1 ] = %d"
[[2; 3] ; [4; 5]] |> getSum |> printfn "[[2; 3] ; [4; 5]] = %d"
[[[|2; 3|] ; [|4; 5|] ] ; [[|6; 7|] ; [|4; 5|] ]] |> getSum |> printfn "[[[|2; 3|] ; [|4; 5|] ] ; [[|6; 7|] ; [|4; 5|] ]] = %d"
(Some 2, [| 2 ; 1 |]) |> getSum |> printfn "Some (2, [| 2 ; 1 |]) = %d"