Se olharmos a fonte do List
módulo OCaml , of_seq
é definido como:
let[@tail_mod_cons] rec of_seq seq = match seq () with | Seq.Nil -> [] | Seq.Cons (x1, seq) -> begin match seq () with | Seq.Nil -> [x1] | Seq.Cons (x2, seq) -> x1 :: x2 :: of_seq seq end
Isso faz todo o sentido , exceto por que o trabalho extra é executado dentro da função em vez de escrever a função seguinte aparentemente mais direta?
let[@tail_mod_cons] rec of_seq seq =
match seq () with
| Seq.Nil -> []
| Seq.Cons (x1, seq) -> x1 :: of_seq seq
Que insight estou faltando para fazer isso fazer sentido?
Isso parece um loop simples se desenrolando para mim. Ou seja, ele distribui a sobrecarga do loop em duas vezes mais chamadas para
seq ()