Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.16 KB | None | 0 0
  1. #r "FSharp.Quotations.Evaluator.dll"
  2. open FSharp.Quotations
  3. open FSharp.Reflection
  4. open FSharp.Quotations.Evaluator
  5.  
  6. module NTuple =
  7.     let init n elements =
  8.         printf "%d\n" n
  9.         if n = 1 then List.head elements
  10.         else Expr.NewTuple elements
  11.     let makeType n =
  12.         if n = 1 then typeof<int>
  13.         else FSharpType.MakeTupleType(typeof<int> |> Array.replicate n)
  14.  
  15.     let get n ind t =
  16.         if n = 1 then t
  17.         else Expr.TupleGet (t, ind)
  18.  
  19.     let head n t = get n 0 t
  20.  
  21.     let tail n t =
  22.         let elements = [for i in 1..n-1 -> get n i t]
  23.         init (n - 1) elements
  24.  
  25. let rec eachindex n size =
  26.     if n = 1
  27.     then
  28.         let x = NTuple.head n size
  29.         <@@ seq {for i in 0..%%(x)-1 -> [i]} @@>
  30.     else
  31.         let x = NTuple.head n size
  32.         let xs = NTuple.tail n size
  33.         let ex = eachindex (n - 1) xs
  34.         <@@
  35.             %%(ex)
  36.             |> Seq.map (fun xs -> seq {for i in 0..%%(x)-1 -> i::xs})
  37.             |> Seq.concat
  38.         @@>
  39.  
  40. let size = <@@ (2, 2) @@>
  41.  
  42. let ex = eachindex 2 size
  43. let (ind:seq<int list>) = QuotationEvaluator.Evaluate (ex |> Expr.Cast)
  44. ind |> Seq.toList
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement