Coleções e listas

Concluído(a)

Você se encontrará em situações em que terá mais do que apenas um tipo de dados. Você poderia criar uma variável para cada elemento dos dados, ou então agrupá-los em uma coleção. O agrupamento dos dados oferece vantagens, como a capacidade de executar métodos não apenas em partes individuais dos dados, mas na coleção como um todo.

Coleções

O primeiro sinal de que você precisa usar uma coleção é se tem várias partes de dados que parecem ser do mesmo tipo. Você pode ter um cenário em que há muitas entradas, como no seguinte código:

let logEntryMonday = "first entry"
let logEntryTuesDay = "second entry"
let logEntryWednesday = "third entry"

Nesse código, você pode continuar adicionando uma entrada semelhante após a outra, mas, em algum momento, essa abordagem começa a ser impraticável. As entradas separadas não estão apenas relacionadas, mas são, na verdade, do mesmo tipo. É uma boa ideia criar uma variável para cada entrada? Provavelmente, não. Em vez disso, considere usar uma coleção, na qual você pode criar um agrupamento lógico e gerenciável, seja adicionando ou removendo dados ou usando alguma outra operação:

logEntriesWeek = ["first entry"; "second entry"; "third entry"]

Esse código não só requer muito menos digitação, mas também cria um senso de ordem, onde tudo o que está relacionado é agrupado.

Então, o que o F# pode oferecer? Para iniciantes, ele oferece três tipos de coleções, cada uma projetada para uma situação específica.

  • Listas: uma lista em F# é um conjunto ordenado e imutável de elementos do mesmo tipo. Imutável significa que uma lista pode oferecer melhor desempenho do que uma matriz, mas talvez você precise ser mais criativo, se quiser alterar seu conteúdo. Por exemplo, talvez você queira criar uma lista a partir de uma já existente. Esta unidade se concentra no uso de listas.

  • Matrizes: matrizes são coleções mutáveis de tamanho fixo de elementos de dados do mesmo tipo, ordenadas consecutivamente com um índice baseado em zero. Mutável significa que é fácil adicionar e remover elementos de dados, mas pode haver um impacto no desempenho.

  • Sequências: são séries lógicas de elementos do mesmo tipo. Uma sequência tem uma sensação de just-in-time, porque funciona bem com grandes coleções de dados, em que você não espera usar todos os elementos. Ela também computa elementos somente quando é necessário fazê-lo. Portanto, as sequências podem oferecer melhor desempenho do que as listas em determinadas situações.

Listas

Como mencionamos, uma lista é um conjunto ordenado e imutável de elementos. Estas são algumas maneiras de criar uma lista:

let cards = ["Ace"; "King"; "Queen"]

Nesse código, você coloca os elementos entre colchetes ([]) para definir a lista. Os itens da lista são separados por ponto e vírgula (;).

Outra maneira de criar uma lista é posicionar cada elemento em uma nova linha, como mostrado aqui. Esse método também elimina a necessidade de usar ponto e vírgula.

let cards = [
  "Ace"
  "King"
  "Queen"
]

Nas listas, os elementos precisam ser do mesmo tipo, portanto, a seguinte declaração não é permitida:

let cards = [ 1; "Ace"; "King" ] // not permitted

Nesse código, como a declaração combina números e cadeias de caracteres, ela não é permitida. Outra maneira de criar uma lista é usar um operador de intervalo (..). A ideia é especificar os elementos inicial e final, separados por um operador de intervalo (..). Isso cria todos os números do início ao fim, incluindo os elementos internos. Por exemplo, você pode criar os números 1 2 3 4 5 usando o seguinte código:

let numbers = [ 1 .. 5 ]

Alterar uma lista

Como mencionamos, as listas são imutáveis, ou seja, não podem ser alteradas. Porém, ao pensar nisso de outra forma, você pode fazer parecer que está adicionando um item ou até mesmo uma lista de itens a uma lista. O que isso significa? Considere o seguinte exemplo:

let cards = ["Ace"; "King"; "Queen"]

O código anterior é uma lista que consiste em três cadeias de caracteres. Usando um operador duplo de dois-pontos (::), você pode acrescentar um item ao início de uma lista. O resultado é uma nova lista, e a lista antiga não é afetada:

let cards = ["Ace"; "King"; "Queen"]
let newList = "Jack" :: cards // "Jack", "Ace", "King", "Queen" 

Você também pode adicionar uma lista inteira usando o operador arroba (@), como mostrado aqui:

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["Jack"; "10"]
let fullList = cards @ otherCardList // "Ace", "King", "Queen", "Jack", "10"

Há uma função append() no módulo de lista que funciona para coleções de matriz e de sequência. Será preferível usar append() se, por exemplo, você precisar alternar o tipo de coleção de lista para sequência ou se quiser evitar ter que aprender uma nova maneira de adicionar itens. Usar o sinal de arroba (@) para adicionar elementos a uma lista funciona apenas para uma estrutura de lista. Vamos revisitar nossos dois exemplos e, em vez disso, usar append():

let cards = ["Ace"; "King"; "Queen"]
let otherCardList = ["10"; "9"]
let fullList = cards |> List.append ["Jack"] // "Jack", "Ace", "King", "Queen"
let fullList = cards |> List.append otherCardList // "10", "9", "Ace", "King", "Queen"

Propriedades

As listas em F# são implementadas como listas vinculadas. Ou seja, uma lista é uma estrutura na qual cada elemento está conectado a outro elemento. Os termos adicionais a serem aprendidos são o cabeçalho, que é o primeiro elemento da lista, e a parte final, que inclui os elementos que não estão no cabeçalho. Por exemplo, na lista 1 2 3 4, o cabeçalho será 1, e a parte final será 2 3 4.

Ao separar os elementos dessa forma, você pode acessar rapidamente o primeiro elemento para que possa ler, remover ou executar outras ações nele. Para acessar qualquer item específico da lista, use uma propriedade Item, que usa um índice baseado em zero, conforme mostrado aqui:

let list = [1; 2; 3; 4]
list.Item 1 // 2

As propriedades da lista são descritas na seguinte tabela:

Propriedade Descrição
Cabeçalho O primeiro elemento em uma lista
Vazio Retorna uma lista vazia e pode ser usado quando você deseja criar uma lista vazia
Está Vazio Verifica se a lista atual está vazia
Elemento Recupera o elemento atual na posição especificada (índice baseado em zero)
Comprimento Retorna o número de itens na lista
Tail Retorna todos, exceto o primeiro elemento da lista