F # 10: listas

Cualquier programación seria en cualquier idioma siempre incluirá listas. Por lo tanto, le complacerá saber que F # admite muy, muy bien las listas mediante su módulo Lista. Una lista en F # es una serie ordenada e inmutable de elementos del mismo tipo.

Crear una lista


Hay varias formas en F # de crear una lista.

  • Crea una lista vacía
  • Crea una lista simple con elementos del 1 al 10
  • Cree una lista con números impares en el rango de 1 a 10
  • Use el bucle for para crear una lista.

let prettyPrint desc list = printfn desc printfn "%A" list //empty list let listEmpty = [] //simple list let list1 = [1 .. 10 ] //simple list, with step value let list2 = [1 ..2..10 ] //using for loops to create lists let list3 = [for i in 1 .. 10 -> i*2 ] prettyPrint "let listEmpty = []" listEmpty prettyPrint "let list1 = [ 1 .. 10 ]" list1 prettyPrint "let list2 = [ 1 .. 2..10 ]" list2 prettyPrint "[ for i in 1 .. 10 -> i*2 ]" list3 

imagen

El último ejemplo que se muestra arriba muestra cómo usar el bucle for para crear una lista, lo cual es muy bueno, pero hay algo aún más genial y poderoso en la caja de herramientas F #, a saber, Comprensiones de lista.

List Comprehensions es un método poderoso que le permite crear listas utilizando prácticamente el F # estándar, que incluye funciones / bucles / condiciones, etc.

Continuemos mirando un ejemplo de cómo podríamos crear listas.

 let is2 x = match x with | 2 -> "YES" | _ -> "NO" //yield directly let list1 = [ yield 1; yield 2; yield 3; ] //yield numbers between 1 and 20 where we use the //Math.Pow function to return a new number let list2 = [for i in 1.0 .. 20.0 do yield Math.Pow(i,2.0) ] //yield only numbers between 1 and 20 that //can be divided by 5 let list3 = [ for i in 1 .. 20 do if i % 5 = 0 then yield i ] //yields YES/NO strings depending on //whether source int = 2 or not let list4 = [for i in 1 .. 5 -> is2 i ] 

imagen

Algunos operadores de listas útiles


Operador contras


Podemos usar el operador contra "::" para agregar valores a una lista existente, así que supongamos que tenemos esta lista:

 let list1 = [1;2;3;4] let list2 = 42 :: list1 

imagen

Operador de concatenación


Otro operador muy útil es el operador "@", que le permite combinar listas del mismo tipo. Entonces, por ejemplo, si tuviéramos esto:

 let list1 = [1;2;3;4] let list2 = [5;6;7;8] let list3 = list1 @ list2 

imagen

Módulo de lista


No creo que me exceda cuando digo que el módulo Lista es un módulo clave en F #. De hecho, la documentación de MSDN es muy buena en comparación con otras en F #. Por lo tanto, no creo que pueda agregar mucha utilidad a los ejemplos encontrados en MSDN, pero daré aquí algunos para su conveniencia, pero debe estudiar MSDN para obtener más información .

Las propiedades


Head
'T
Primer elemento
Empty
'T list
Devuelve una lista vacía del tipo especificado
Isempty
bool
verdadero: si no hay elementos en la lista
Artículo
'T
Un elemento que está en un índice específico
Longitud
int
Numero de articulos
Cola
'T lista
Lista sin primer elemento:

 let list1 = [ 1; 2; 3 ] // Properties printfn "list1.IsEmpty is %b" (list1.IsEmpty) printfn "list1.Length is %d" (list1.Length) printfn "list1.Head is %d" (list1.Head) printfn "list1.Tail.Head is %d" (list1.Tail.Head) printfn "list1.Tail.Tail.Head is %d" (list1.Tail.Tail.Head) printfn "list1.Item(1) is %d" (list1.Item(1)) 

imagen

Filtro


Devuelve una nueva colección que contiene solo los elementos de la colección para los cuales el predicado dado devuelve verdadero. Aquí hay un ejemplo trivial que selecciona solo números pares de una lista para crear una nueva lista

 let evenOnlyList = List.filter (fun x -> x % 2 = 0) [1; 2; 3; 4; 5; 6] 

imagen

Buscar (encontrar)


Devuelve el primer elemento para el que esta función devuelve verdadero. En este ejemplo, dado que la lista del 1 al 100 contiene 5, 5 es el primer número, que se divide por 5, por lo que este es el valor de retorno:

imagen

Para todos (para todos)


Comprueba si todos los elementos de la colección satisfacen un predicado dado. En este ejemplo, toda la lista debe contener 0 para obtener el verdadero valor de retorno.

 let isAllZeroes list = List.forall (fun elem -> elem = 0.0) list printfn "%b" (isAllZeroes [0.0; 0.0]) printfn "%b" (isAllZeroes [0.0; 1.0]) 

imagen

Aplicar a todos (Iteri)


Aplica esta función a cada elemento de la colección. El entero pasado a la función indica el índice del elemento.

 let data = ["Cats";"Dogs";"Mice";"Elephants"] data |> List.iteri (fun ix -> printfn "item %d: %s" ix) 

imagen

Ordenar por (Ordenar con)


Ordena la lista especificada usando esta función de comparación.

 let list1 = [ ""; "&"; "&&"; "&&&"; ""; "|"; "||"; "|||" ] printfn "Before sorting: " list1 |> printfn "%A" //custom sorting function let sortFunction (string1:string) (string2:string) = if (string1.Length > string2.Length) then 1 else if (string1.Length printfn "After sorting:\n%A" 

imagen

Hay muchas funciones útiles en el módulo de lista, esto es solo una pequeña parte de lo que puede encontrar.

Una pequeña mirada a la recursividad en las listas


Ninguna discusión sobre las listas estaría completa sin hablar de la recursión. La recursión es de lo que se tratará toda la publicación, pero por ahora, echemos un vistazo a lo que se necesita para escribir una función recursiva que funcione en una lista en F #.

 let printIt desc x = printfn "%A %A" desc x let rec printList list = match list with | h :: t -> printIt "head=" h printIt "tail=" t printList t | [] -> () printList [1;2;3;4;5] 

Tenga en cuenta el uso de la palabra clave rec , que le dice al compilador de F # que esta función será recursiva. Sin esta palabra clave, una llamada de función recursiva: recibirá un mensaje de error de compilación, aunque con un texto de error no muy claro.

imagen

Entonces, veamos los resultados del ejemplo que se muestran un poco más arriba con la siguiente lista [1; 2; 3; 4; 5]

imagen

Puede ver que todo funciona bien y deja de funcionar cuando el valor coincide con una lista vacía, como se esperaba.

Source: https://habr.com/ru/post/471998/


All Articles