[F#] seq и IEnumerator
От: Anton V. Kolotaev  
Дата: 20.07.09 14:45
Оценка:
Господа, есть ли способ избавиться от явного использования IEnumerator в следующем коде преобразования потока лексем в дерево?

#light

type Dest = | Node of string * list<Dest>

let incremented(it : System.Collections.Generic.IEnumerator<'a>) = 
   
   if it.MoveNext() then it else failwith "enumeration finished"

let parse(src : seq<int * string>) : seq<Dest> = 
   
   let rec impl (it : System.Collections.Generic.IEnumerator<int * string>) : Dest = 
      
      let (count, label) = it.Current
      Node(label, seq { for i in 0 .. count-1 -> impl(incremented(it)) } |> Seq.to_list)
   
   seq {   
      let it = src.GetEnumerator()
      
      while it.MoveNext() do
         yield impl it
   }
    
let input = [(2,"root");(0,"A");(2,"B");(0,"B1");(0,"B2")]

let output = input |> parse |> Seq.to_list

output |> any_to_string |>System.Console.WriteLine
f# seq ienumerator
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.