Uma list em F# é uma coleção imutável de zero ou mais valores. Os valores em uma lista precisam ter todos o mesmo tipo. Como as listas são imutáveis, depois que uma lista é construída, seu valor nunca pode mudar. Qualquer função ou operador que pareça modificar uma lista (como adicionar um elemento) na verdade retorna uma nova lista.
Listas podem ser definidas assim:
let empty = []
let singleValue = [5]
let threeValues = ["a"; "b"; "c"]
A forma mais comum de adicionar um elemento a uma lista é com o operador :: (cons):
let twoToFour = [2; 3; 4]
let oneToFour = 1 :: twoToFour
// => [1; 2; 3; 4]
Uma lista em F# tem uma cabeça (o primeiro elemento) e uma cauda (tudo depois do primeiro elemento). A cauda de uma lista é ela mesma uma lista.
As listas são manipuladas por funções e operadores definidos no módulo List, ou manualmente com correspondência de padrões usando os padrões list e cons:
let describe list =
match list with
| [] -> "Empty list"
| head::tail -> sprintf "Non-empty list with head: %d" head
describe [] // => "Empty list"
describe [1] // => "Non-empty with head: 1"
describe [5; 7; 9] // => "Non-empty with head: 5"
Você também pode descartar um valor ao fazer correspondência de padrões; quando você não se importa com um valor em um caso específico (ou seja, não vai usar aquele valor), pode usar um sublinhado ('_') para indicar isso:
let describe list =
match list with
| [] -> "Empty list"
| [x] -> "List with one item"
| [_; y] -> "List with two items (first item ignored)"
| _ -> "List with many items (all items ignored)"
describe [] // => "Empty list"
describe [1] // => "List with one item"
describe [5; 7] // => "List with two items (first item ignored)"
describe [5; 7; 9] // => "List with many items (all items ignored)"
O '_' sozinho deve vir sempre por último na correspondência de padrões; todo valor que não corresponder a nenhum dos outros casos será tratado por esse caso.
Neste exercício, você vai escrever código para acompanhar uma lista de linguagens de programação que você quer aprender no Exercism.
São seis tarefas, e todas envolvem lidar com listas.
Para acompanhar as linguagens que você quer aprender, você vai precisar criar uma nova lista. Defina o binding newList, que contém uma nova lista vazia.
newList
// => []
No momento, você tem um pedaço de papel com as linguagens que quer aprender: F#, Clojure e Haskell. Defina o binding existingList para representar essa lista.
existingList
// => ["F#"; "Clojure"; "Haskell"]
Conforme você explora o Exercism e encontra linguagens mais interessantes, você vai querer adicioná-las à sua lista. Implemente a função addLanguage para adicionar uma nova linguagem ao início da sua lista.
addLanguage "TypeScript" ["JavaScript"; "CoffeeScript"]
// => ["TypeScript"; "JavaScript"; "CoffeeScript"]
Contar as linguagens uma a uma é inconveniente. Implemente a função countLanguages para contar quantas linguagens há na sua lista.
countLanguages ["C#"; "Racket"; "Rust"; "Ruby"]
// => 4
Em algum momento, você percebe que sua lista está na verdade ordenada ao contrário! Implemente a função reverseList para inverter a sua lista.
reverseList ["Prolog"; "C"; "Idris"; "Assembly"]
// => ["Assembly"; "Idris"; "C"; "Prolog"]
Embora você ame todas as linguagens, o F# ocupa um lugar especial no seu coração. Por isso, uma lista de linguagens te empolga muito quando:
Implemente a função excitingList para verificar se uma lista de linguagens é empolgante:
excitingList ["Nim"; "F#"]
// => true
Crie sua conta no Exercism para aprender e dominar F# com 18 conceitos148 exercícios e mentoria humana de verdade, tudo de graça.