2010-12-02 13 views
12

¿Por qué no hay List.skip y List.take? Por supuesto, hay Seq.take y Seq.skip, pero no crean listas como resultado.¿Por qué no hay List.skip y List.take?

Una posible solución es: mylist |> Seq.skip N |> Seq.toList Pero esto crea el primer enumerador y luego una nueva lista de ese enumerador. Creo que podría haber una forma más directa de crear una lista inmutable a partir de una lista inmutable. Como no hay copia de elementos internamente, solo hay referencias de la nueva lista a la original.

Otra solución posible (sin lanzar excepciones) es:

let rec listSkip n xs = 
    match (n, xs) with 
    | 0, _ -> xs 
    | _, [] -> [] 
    | n, _::xs -> listSkip (n-1) xs 

Pero esto todavía no responde a la pregunta ...

+4

'List.skip' no necesitaría crear una nueva lista, pero' List.take' lo haría. – Benjol

+0

¡Tienes toda la razón! –

Respuesta

8

La supuesta List.skip 1 se llama List.tail, usted puede simplemente tail en la lista n veces.

List.take habría que crear una nueva lista de todos modos, ya que sólo los sufijos comunes de una lista inmutable pueden ser compartidos.

11

Por cierto, usted puede agregar sus funciones a la lista módulo:

module List = 
    let rec skip n xs = 
     match (n, xs) with 
     | 0, _ -> xs 
     | _, [] -> [] 
     | n, _::xs -> skip (n-1) xs 
+0

¡Buen punto, gracias! –

+0

buena respuesta, pero los valores negativos de n. esto siempre devuelve una lista vacía en lugar de la misma. alternativa: let rec skip n xs = if 0 symbiont

Cuestiones relacionadas