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:18] – [<expected>] 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 '' | ||
- | Dabei werden | + | Im Ergebnis entsteht wiederum ein '' |
+ | Dabei werden | ||
^ Wert vorhanden? ^ ja ^ nein ^Rückgabetyp von '' | ^ Wert vorhanden? ^ ja ^ nein ^Rückgabetyp von '' | ||
Zeile 44: | Zeile 51: | ||
| '' | | '' | ||
| '' | | '' | ||
+ | |||
+ | Mit den monadischen Operationen lassen sich Verarbeitungsschritte und eventuell auftretende Fehler verketten: | ||
+ | |||
+ | <code cpp name_of_weekday.cpp> | ||
+ | #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:: | ||
+ | } | ||
+ | </ | ||
Siehe auch: [[optional]], | Siehe auch: [[optional]], | ||
kennen/include/expected.1730477896.txt.gz · Zuletzt geändert: 2024-11-01 17:18 von rrichter