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.

War es hilfreich?

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 [].

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top