Ein array in F# ist eine veränderliche Sammlung von null oder mehr Werten mit fester Länge. Das bedeutet, dass sich die Größe eines Arrays nach seiner Erstellung nicht mehr ändern kann, seine Werte aber schon. Alle Werte in einem Array müssen denselben Typ haben. Arrays lassen sich wie folgt definieren:
let empty = [| |]
let emptyAlternative = Array.empty
let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5
let threeValues = [| "a"; "b"; "c" |]
Über einen Index kannst du Elemente einem Array zuweisen oder aus ihm abrufen. F#-Arrays sind nullbasiert, das heißt, der Index des ersten Elements ist immer null:
let numbers = [| 2; 3; 5 |]
// Update value in array
numbers[2] <- 9
// Read value from array
numbers[2]
// => 9
Arrays werden entweder mit Funktionen und Operatoren aus dem Array-Modul bearbeitet oder manuell per Musterabgleich mit dem array-Muster:
let describe array =
match array with
| [| |] -> "Empty"
| [| 1; 2; three |] -> sprintf "1, 2, %d" three
| _ -> "Other"
describe [| |] // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"
Beim Musterabgleich kannst du einen Wert auch verwerfen; wenn dir ein Wert in einem bestimmten Fall nicht wichtig ist (das heißt, du wirst den Wert nicht verwenden), kannst du dies mit einem Unterstrich ('_') kennzeichnen:
let describe array =
match array with
| [| |] -> "Empty array"
| [| x |] -> "Array with one item"
| [| _; y |] -> "Array with two items (first item ignored)"
| _ -> "Array with many items (all items ignored)"
describe [| |] // => "Empty array"
describe [| 1 |] // => "Array with one item"
describe [| 5; 7 |] // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |] // => "Array with many items (all items ignored)"
Der einzelne '_' sollte beim Musterabgleich immer zuletzt stehen; jeder Wert, der auf keinen der anderen Fälle passt, wird von diesem Fall behandelt.
Du bist ein begeisterter Vogelbeobachter und hältst fest, wie viele Vögel in den letzten sieben Tagen deinen Garten besucht haben.
Es gibt sechs Aufgaben, die sich alle mit der Anzahl der Vögel befassen, die deinen Garten besucht haben.
Zu Vergleichszwecken hast du immer eine Kopie der Zählungen der letzten Woche in der Nähe, und zwar: 0, 2, 5, 3, 7, 8 und 4. Definiere die Bindung lastWeek, die die Zählungen der letzten Woche enthält:
lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]
Implementiere die Funktion yesterday, die zurückgibt, wie viele Vögel gestern deinen Garten besucht haben. Die Vogelzählungen sind nach Tagen geordnet, wobei das erste Element die Zählung des ältesten Tages und das letzte Element die heutige Zählung ist.
yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4
Implementiere die Funktion total, die die Gesamtzahl der Vögel zurückgibt, die deinen Garten besucht haben:
total [| 3; 5; 0; 7; 4; 1 |]
// => 20
Implementiere die Funktion dayWithoutBirds, die true zurückgibt, wenn es einen Tag gab, an dem null Vögel den Garten besucht haben; andernfalls gibt sie false zurück:
dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true
Implementiere die Funktion incrementTodaysCount, um die heutige Zählung zu erhöhen und die aktualisierten Zählungen zurückzugeben:
let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]
Im letzten Jahr hast du festgestellt, dass manche Wochen dieselben, ungewöhnlichen Muster haben:
Implementiere die Funktion unusualWeek, die true zurückgibt, wenn das Vogelzählmuster dieser Woche einem der ungewöhnlichen Muster entspricht:
unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true
unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true
(Beachte, dass die Tagesparität 1-basiert ist und nicht 0-basiert: Das erste Element im Array entspricht einem ungeraden Tag)
Melde dich bei Exercism an, um F# mit 18 Konzepte148 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.