Track
/
F#
F#
/
Esercizi
/
Seguace della moda
Seguace della moda

Seguace della moda

Esercizio di apprendimento

Introduzione

I record

Un record è una raccolta di campi (che possono essere di tipi diversi) che stanno insieme. Per definire un record si usa la parola chiave type. I campi di un record si definiscono tra i caratteri { e }, e ogni campo ha un nome e un tipo. Per creare un record, specifica i nomi dei campi e assegna loro un valore tra i caratteri { e }. Quando crei un record, a tutti i campi va assegnato un valore. I valori dei campi di un'istanza di un record si possono leggere con la notazione con il punto.

Quando definisci o crei un record, ogni campo deve stare su una riga separata oppure, se sono tutti su una sola riga, essere separati da punti e virgola (;).

// Define a record
type Address =
    { Street: string
      HouseNumber: int }

// Create a record
let oldAddress: Address =
    { Street = "Main Street"
      HouseNumber = 17 }

// Single-line alternative
type ConciseAddress = { Street: string; HouseNumber: int }
let conciseAddress: ConciseAddress = { Street = "Main Street"; HouseNumber = 17 }

Poiché i record sono immutabili, una volta costruito un record i valori dei suoi campi non possono più cambiare. Se vuoi cambiare i valori di un record, la parola chiave with ti permette di creare una copia di un record esistente, ma con nuovi valori per uno o più campi.

// Copy the old address but change the house number
let newAddress: Address = { oldAddress with HouseNumber = 86 }
newAddress.Street      // => "Main Street"
newAddress.HouseNumber // => 86

I record hanno l'uguaglianza strutturale: due istanze dello stesso record con valori identici sono equivalenti.

Oltre a poter usare la notazione con il punto per accedere ai campi di un record, i record si possono anche destrutturare nei binding e nel pattern matching:

let myAddress: Address = { Street = "Broadway"; HouseNumber = 123 }
let { Street = myStreet; HouseNumber = myHouseNumber } = myAddress

match myAddress with
| { HouseNumber = 1 } -> printfn "First house"
| { HouseNumber = houseNumber; Street = street } -> printfn "House number %d on %s" houseNumber street
// => "House number 123 on Broadway

Istruzioni

In questo esercizio sei un grande appassionato di sport e hai appena scoperto una passione per il basket NBA. Dato che sei nuovo al basket NBA, stai facendo un'immersione profonda nella storia della NBA, tenendo traccia di squadre, allenatori e delle loro statistiche di vittorie e sconfitte, e confrontando le squadre tra loro.

Dato che non hai ancora una squadra del cuore, svilupperai anche un algoritmo per capire se fare il tifo per una squadra in particolare.

Hai sette attività che ti aiuteranno a sviluppare il tuo algoritmo proprietario fai il tifo per una squadra.

1. Definisci il modello

Definisci il record Coach con i due campi seguenti:

  • Name: il nome dell'allenatore, di tipo string.
  • FormerPlayer: indica se l'allenatore è stato un ex giocatore, di tipo bool.

Definisci il record Stats con i due campi seguenti:

  • Wins: il numero di vittorie, di tipo int.
  • Losses: il numero di sconfitte, di tipo int.

Definisci il record Team con i tre campi seguenti:

  • Name: il nome della squadra, di tipo string.
  • Coach: l'allenatore della squadra, di tipo Coach.
  • Stats: le statistiche della squadra, di tipo Stats.

2. Crea l'allenatore di una squadra

Implementa la funzione createCoach che prende come parametri il nome dell'allenatore e il suo stato di ex giocatore, e restituisce il suo record Coach:

createCoach "Larry Bird" true
// => { Name = "Larry Bird"; FormerPlayer = true }

3. Crea le statistiche di una squadra

Implementa la funzione createStats che prende come parametri il numero di vittorie e il numero di sconfitte, e restituisce il suo record Stats:

createStats 58 24
// => { Wins = 58; Losses = 24 }

4. Crea una squadra

Implementa la funzione createTeam che prende come parametri il nome della squadra, l'allenatore e il record, e restituisce il suo record Team:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
createTeam "Indiana Pacers" coach record
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Larry Bird"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

5. Sostituisci l'allenatore

Dato che i proprietari NBA sono impazienti, hai scoperto che i cattivi risultati della squadra portavano spesso alla sostituzione dell'allenatore. Implementa la funzione replaceCoach che prende come parametri la squadra e il suo nuovo allenatore, e restituisce la squadra ma con il nuovo allenatore:

let coach = createCoach "Larry Bird" true
let record = createStats 58 24
let team = createTeam "Indiana Pacers" coach record

let newCoach = createCoach "Isiah Thomas" true
replaceCoach team newCoach
// => { Name = "Indiana Pacers"
//      Coach = { Name = "Isiah Thomas"; FormerPlayer = true }
//      Stats = { Wins = 58; Losses = 24 } }

6. Controlla se è la stessa squadra

Mentre approfondisci le statistiche, tieni degli elenchi di squadre e dei loro record. A volte sbagli e ci sono voci duplicate nel tuo elenco. Implementa la funzione isSameTeam che prende due squadre e restituisce true se sono la stessa squadra; altrimenti, restituisci false:

let pacersCoach = createCoach "Larry Bird" true
let pacersStats = createStats 58 24
let pacersTeam = createTeam "Indiana Pacers" pacersCoach pacersStats

let lakersCoach = createCoach "Del Harris" false
let lakersStats = createStats 61 21
let lakersTeam = createTeam "LA Lakers" lakersCoach lakersStats

isSameTeam pacersTeam lakersTeam
// => false

7. Controlla se dovresti fare il tifo per una squadra

Dopo aver esaminato molte squadre e partite, hai ideato un algoritmo. Se una delle seguenti condizioni è vera, fai il tifo per quella squadra:

  • Il nome dell'allenatore è «Gregg Popovich»
  • L'allenatore è un ex giocatore
  • Il nome della squadra è «Chicago Bulls»
  • La squadra ha vinto 60 o più partite
  • La squadra ha più sconfitte che vittorie

Implementa la funzione rootForTeam che prende una squadra e restituisce true se dovresti fare il tifo per quella squadra; altrimenti, return false:

let spursCoach = createCoach "Gregg Popovich" false
let spursStats = createStats 56 26
let spursTeam = createTeam "San Antonio Spurs" spursCoach spursStats
rootForTeam spursTeam
// => true
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
F# Exercism

Vuoi iniziare Seguace della moda?

Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.