kennen:include:expected
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| kennen:include:expected [2024-11-01 17:22] – [Methoden] rrichter | kennen:include:expected [2024-11-01 20:33] (aktuell) – [Monadische Operationen] rrichter | ||
|---|---|---|---|
| Zeile 19: | Zeile 19: | ||
| { | { | ||
| auto answer = question(6*n); | auto answer = question(6*n); | ||
| - | if (answer.has_value()) | + | if (answer.has_value()) // oder: if(answer) |
| std:: | std:: | ||
| else | else | ||
| Zeile 35: | Zeile 35: | ||
| | '' | | '' | ||
| - | Außerdem sind " | + | ===== Monadische |
| + | > Monad: a monoid in the category of endofunctors | ||
| + | > -- James Iry | ||
| + | |||
| + | > Once you understand, you lose the ability to explain. | ||
| + | > -- https:// | ||
| Diese rufen in Abhängigkeit vom Vorhandensein eines Wertes eine Funktion '' | Diese rufen in Abhängigkeit vom Vorhandensein eines Wertes eine Funktion '' | ||
| Im Ergebnis entsteht wiederum ein '' | Im Ergebnis entsteht wiederum ein '' | ||
| - | Dabei werden die Typen von '' | + | Dabei werden die Typen '' |
| ^ Wert vorhanden? ^ ja ^ nein ^Rückgabetyp von '' | ^ Wert vorhanden? ^ ja ^ nein ^Rückgabetyp von '' | ||
| Zeile 46: | Zeile 52: | ||
| | '' | | '' | ||
| - | < | + | Mit den monadischen Operationen lassen sich Verarbeitungsschritte und eventuell auftretende Fehler verketten: |
| - | TODO | + | |
| + | < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | struct Date { int y, m, d; }; | ||
| + | |||
| + | auto leapyear(int y) | ||
| + | { | ||
| + | return (y % 4 == 0 && !(y % 100 == 0)) || y % 400 == 0; | ||
| + | } | ||
| + | |||
| + | auto day_of_week(Date date) // Zellers Kongruenz, Gregorianisch: | ||
| + | { | ||
| + | auto [y,m,d] = date; | ||
| + | if (m < 3) { m += 12; --y; } | ||
| + | auto C = y / 100; | ||
| + | auto D = y % 100; | ||
| + | return (d + 13*(m+1)/5 + D + D/4 + C/4 + 5*C) % 7; | ||
| + | } | ||
| + | |||
| + | auto name_of_weekday(int w) | ||
| + | { | ||
| + | std::string const name[] = { " | ||
| + | return name[w]; | ||
| + | } | ||
| + | |||
| + | std:: | ||
| + | { | ||
| + | Date date; | ||
| + | char sep; | ||
| + | |||
| + | std::cout << "Datum (y-m-d): "; | ||
| + | |||
| + | if (std::cin >> date.y >> sep >> date.m >> sep >> date.d && sep == ' | ||
| + | return date; | ||
| + | else | ||
| + | return std:: | ||
| + | } | ||
| + | |||
| + | std:: | ||
| + | { | ||
| + | if (date.m < 1 || date.m > 12) return std:: | ||
| + | if (date.d < 1 || date.d > 31) return std:: | ||
| + | |||
| + | for (auto m : { 4, 6, 9, 11 }) | ||
| + | { | ||
| + | if (m == date.m && date.d == 31) | ||
| + | return std:: | ||
| + | } | ||
| + | if (date.m == 2 && date.d > 28 + leapyear(date.y)) | ||
| + | { | ||
| + | return std:: | ||
| + | } | ||
| + | return date; | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | auto result = input() | ||
| + | .and_then(valid) | ||
| + | .transform(day_of_week) | ||
| + | .transform(name_of_weekday) | ||
| + | .transform_error([](std:: | ||
| + | .or_else([](const std:: | ||
| + | std:: | ||
| + | return std:: | ||
| + | }); | ||
| + | |||
| + | if (result) std:: | ||
| + | else std:: | ||
| + | } | ||
| </ | </ | ||
kennen/include/expected.1730478132.txt.gz · Zuletzt geändert: von rrichter
