type Peano = interface end
and Zero = Zero with
static member inline (|*|) (f, Zero) = f $ Zero
interface Peano
and Succ<'a when 'a :> Peano> = Succ of 'a with
static member inline (|*|) (f, Succ(x)) = f $ Succ(x)
interface Peano
type PeanoToInt = PeanoToInt with
static member inline ($) (PeanoToInt, Zero) = 0
static member inline ($) (PeanoToInt, Succ (x)) = 1 + (PeanoToInt |*| x)
type Repeat = Repeat with
static member inline ($) (Repeat, Zero) = fun f -> ()
static member inline ($) (Repeat, (Succ (x) as p)) = fun f ->
(Repeat |*| x) f
f (PeanoToInt $ p)
let four = Succ (Succ (Succ (Succ Zero)))
let inline repeat step f = (Repeat $ step) f
// Examples
repeat four (fun index -> printfn "index: %d" index)
// zero-out
let array = [|1..8|]
for i in 0 .. 4 .. array.Length - 1 do
repeat four (fun index -> array.[i + (index - 1)] <- 0)