„Vielleicht“ -ähnliche Funktion für Bool und Mailingliste?
-
27-09-2019 - |
Frage
ich mich Manchmal finden Progamming das Muster „wenn die Bool ist nicht falsch“ oder „wenn die Liste nicht leer nützt es, sonst etwas anderes nutzen“.
Ich suche Funktionen für Bool und List, die, was die „vielleicht“ -Funktion Vielleicht ist. Gibt es?
Update: Ich meinte den Bool-Fall als eine Verallgemeinerung des List-Falles zu verwenden. Zum Beispiel, wenn sie mit data.text als T arbeiten:
if T.null x then x else foo x
Ich suche solche Kesselblech Code zu reduzieren.
Lösung
Ich denke, die Antwort ist wahrscheinlich, dass es nicht so eine generische Funktion ist. Wie djv sagt, können Sie vielleicht auf Data.Monoid bauen zu schreiben, so etwas wie:
maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b
maybe' repl f x = if x == mempty then repl else f x
Aber ich weiß nicht von irgendwelchen Funktionen in der Standardbibliothek wie die (oder eine, die leicht zusammen, so zu tun, zusammengesetzt sein könnte).
Andere Tipps
vielleicht ist die catamorphism der Vielleicht geben.
foldr ist die catamorphism der Liste Typ.
Wenn Sie verwendet hatte vielleicht wie: maybe x (const y)
Sie können verwenden: foldr (const (const y)) x
Für Bool ich auch die catamorphism in der Standardbibliothek verpassen, aber es wäre:
bool :: a -> a -> Bool -> a
bool t _ True = t
bool _ f False = f
Überprüfen Sie Data.Monoid , es ist ein typeclass Datentyp beschrieben werden, die einen bestimmten leeren Wert hat, und Sie können Muster-Match auf sich Ihre generische Funktion zu schreiben. Es gibt Fälle, für Bool
mit leeren Wert False
und für List
mit leeren Wert []
.