una simple función de agregación como esto (en C#):¿Cómo puedo implementar una lista recursiva de cola?
let rec app s t =
match s with
| [] -> t
| (x::ss) -> x :: (app ss t)
se bloqueará cuando s se convierte en grande, ya que la función no es recursiva cola. Me di cuenta de que la función de anexión estándar de F # no falla con las listas grandes, por lo que debe implementarse de manera diferente. Entonces me pregunté: ¿Cómo se ve una definición recursiva de cola? Se me ocurrió algo como esto:
let rec comb s t =
match s with
| [] -> t
| (x::ss) -> comb ss (x::t)
let app2 s t = comb (List.rev s) t
que funciona, pero parece bastante extraño. ¿Hay una definición más elegante?
En el primer ejemplo, ¿cuál es el punto de hacer coincidir patrones en b si es el mismo en todos los patrones? Simplemente puede usar b – Rubys
@Rubys: es una opción de estilo, ni correcta ni incorrecta;) – Juliet
¿Está seguro de que está funcionando? Obtengo > append2 [1; 2] [3; 4] ;; val it: int list = [2; 3; 4] y > append3 [1; 2] [3; 4] ;; val it: int list = [1; 3; 4] Aunque no veo el error, append2 me parece bien ... – martingw