Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 4th, 2012  |  syntax: None  |  size: 0.78 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. // for more info http://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/lists.pdf
  2.  
  3. type FuncList<'a> = 'a list -> 'a list
  4. // Monoid comprehension
  5. type FuncListBuilder() =
  6.     member self.Combine (first : FuncList<'a>, second : FuncList<'a>) : FuncList<'a>  = (first << second)
  7.     member self.Zero() : FuncList<'a> = id
  8.     member self.Yield (value : 'a) : FuncList<'a> = fun tail -> value :: tail
  9.     member self.YieldFrom (value : FuncList<'a>) : FuncList<'a> = value
  10.     member self.Delay ( f : unit -> FuncList<'a>) : FuncList<'a> = (fun tail -> f () tail)
  11.  
  12. let funcList = new FuncListBuilder()
  13.  
  14.  
  15. // example
  16. let rec reverse list =
  17.     match list with
  18.     | [] -> funcList.Zero()
  19.     | x :: xs -> funcList { yield! reverse xs; yield x }
  20.  
  21. reverse [1..10] [] // returns [10; 9; 8; 7; 6; 5; 4; 3; 2; 1]