F # 10: Listas

Qualquer programação séria em qualquer idioma sempre incluirá listas. Assim, você ficará satisfeito em saber que o F # suporta muito bem listas usando seu módulo List. Uma lista em F # é uma série ordenada e imutável de elementos do mesmo tipo.

Crie uma lista


Existem várias maneiras no F # de criar uma lista.

  • Crie uma lista vazia
  • Crie uma lista simples com itens de 1 a 10
  • Crie uma lista com números ímpares no intervalo de 1 a 10
  • Use o loop for para criar uma 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 

imagem

O último exemplo mostrado acima mostra como usar o loop for para criar uma lista, o que é muito legal, mas há algo ainda mais interessante e poderoso na caixa de ferramentas do F #, a saber Compreensões da Lista.

Compreensões de lista é um método poderoso que permite criar listas usando praticamente o F # padrão, que inclui funções / loops / condições, etc.

Vamos continuar a ver um exemplo de como poderíamos criar 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 ] 

imagem

Alguns operadores de lista úteis


Contras operador


Podemos usar o operador contras “::” para adicionar valores a uma lista existente, portanto, suponha que tenhamos esta lista:

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

imagem

Operador de concatenação


Outro operador muito útil é o operador "@", que permite combinar listas do mesmo tipo. Então, por exemplo, se tivéssemos isso:

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

imagem

Módulo de lista


Acho que não exagerei quando digo que o módulo List é um módulo chave em F #. De fato, a documentação do MSDN é muito boa em comparação com outras no F #. Portanto, acho que não posso acrescentar muita utilidade aos exemplos encontrados no MSDN, mas darei alguns aqui para sua conveniência, mas você deve estudar o MSDN para obter mais informações .

As propriedades


Head
'T
Primeiro elemento
Empty
'T list
Retorna uma lista vazia do tipo especificado
Isempty
bool
true - se não houver elementos na lista
Item
'T
Um item que está em um índice específico
Comprimento
int
Número de itens
Cauda
Lista T
Lista sem primeiro item:

 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)) 

imagem

Filtro


Retorna uma nova coleção que contém apenas os elementos da coleção para os quais o predicado especificado retorna verdadeiro. Aqui está um exemplo trivial que seleciona apenas números pares de uma lista para criar uma nova lista

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

imagem

Pesquisar (localizar)


Retorna o primeiro elemento para o qual essa função retorna true. Neste exemplo, como a lista de 1 a 100 contém 5, 5 é o 1º número, dividido por 5, então esse é o valor de retorno:

imagem

Para todos (forall)


Verifica se todos os elementos da coleção atendem a um determinado predicado. Neste exemplo, a lista inteira deve conter 0 para obter o verdadeiro 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]) 

imagem

Aplicar a todos (Iteri)


Aplica essa função a cada item da coleção. O número inteiro passado para a função indica o índice do elemento.

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

imagem

Classificar por (SortWith)


Classifica a lista especificada usando esta função de comparação.

 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" 

imagem

Existem muitas funções úteis no módulo de lista, essa é apenas uma pequena parte do que você pode encontrar.

Uma pequena olhada na recursão sobre listas


Nenhuma discussão sobre listas seria completa sem falar em recursão.Recursão é o assunto de toda a postagem, mas, por enquanto, vamos dar uma olhada no que é necessário para escrever uma função recursiva que funciona em uma lista em 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] 

Observe o uso da palavra-chave rec , que informa ao compilador F # que essa função será recursiva. Sem essa palavra-chave, uma chamada de função recursiva - você receberá uma mensagem de erro de compilação, embora com um texto de erro não muito claro.

imagem

Então, vamos ver os resultados do exemplo mostrados um pouco mais alto com a seguinte lista [1; 2; 3; 4; 5]

imagem

Você pode ver que tudo funciona muito bem e para de funcionar quando o valor corresponde a uma lista vazia, conforme o esperado.

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


All Articles