F# does not get support C# style continuations yet; I am reliably informed that it will do at some point.

 

However if you can not wait that long it is already fair easy to get C# style continuations by implementing System.Collections.Generic.IEmunerable your self. What’s more this can be implemented as a library function then implementing your enumerator becomes just a couple of lines of code.

 

Here is my implementation:

 

module Strangelights.Continuations

 

open System

open System.Collections

open System.Collections.Generic

 

// This function makes an IEnumerable interface from

// a mutable value "n" and a function "f" that takes unit and

// returns a boolean. The idea is that the function mutates

// the value return true while there are more values left

let make_enumberable n f =

 

    // this function creates a class that implments the

    // IEnumerator interface

    let make_enumerator() =

        { new IEnumerator<_> with // implment IEnumerator itself

            get_Current() = ! n  // return value held in n

        interface IEnumerator with // implment the non generic IEnumerator

            Reset() = failwith "not implmented"

            and MoveNext() =

                f() // call the funcition we were given

            and get_Current() = ! n :> obj // expose n with downcast to obj

        interface  IDisposable with // implment IDisposable

            Dispose() = () } in

           

    // now we need to implment IEnumerable to make IEnumerator

    // more friendly to our calling clients

    { new IEnumerable<_> with // implment IEnumerable itself

        GetEnumerator() = make_enumerator()

    interface IEnumerable with // implment the non generic IEnumerable

        GetEnumerator() = make_enumerator() :> IEnumerator }

       

let make_fib_enumberable() =

    let n  = ref 0I in      // the Fibonacci number itself

    let nPlus1 = ref 1I in  // the next number in the sequence

 

    // function that calculates the next Fibonacci number

    // by changing the values n and nPlus1

    let get_next() =       

        let temp = ! nPlus1 in

        nPlus1 := ! n  + ! nPlus1;

        n :=  temp;

        true in

 

    // make the enumberator

    make_enumberable n get_next

 

// take the fist 40 numbers from our infinite list

let fibs = IEnumerable.take 40 (make_fib_enumberable())

 

// display the list

do

    fibs |> List.iter (fun i -> print_string (i.ToString()) ; print_newline());

    read_line() |> ignore