typestar

grade_report.fsx en F#

Boletines desde un roster de records, un match con guardas y columnas.

// Average each student's scores and print a letter-grade report card.

type Student = { Name: string; Scores: int list }

let roster =
    [ { Name = "Ada"; Scores = [92; 88; 97] }
      { Name = "Grace"; Scores = [84; 91; 78] }
      { Name = "Alan"; Scores = [70; 66; 74] }
      { Name = "Edsger"; Scores = [58; 67; 61] } ]

let average student =
    student.Scores |> List.sumBy float
    |> fun total -> total / float (List.length student.Scores)

let letter avg =
    match avg with
    | a when a >= 90.0 -> "A"
    | a when a >= 80.0 -> "B"
    | a when a >= 70.0 -> "C"
    | a when a >= 60.0 -> "D"
    | _ -> "F"

printfn "student  avg grade"
for s in roster |> List.sortBy (fun s -> s.Name) do
    let avg = average s
    printfn "%-8s %4.1f  %s" s.Name avg (letter avg)

let classAvg =
    roster |> List.collect (fun s -> s.Scores)
    |> List.averageBy float
printfn "Class average: %.1f" classAvg

Cómo funciona

  1. Student es un record; el roster es un literal de lista.
  2. letter califica por una escalera de guardas when.
  3. List.collect junta cada puntaje para el promedio del curso.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
31
Caracteres a escribir
843
Tokens
248
Ritmo de tres estrellas
60 tpm

Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 248 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →