2010-10-01 9 views
5

Manchmal programmiere ich das Muster "Wenn das Bool nicht falsch ist" oder "Wenn die Liste nicht leer ist, benutze es, sonst verwende etwas anderes"."Vielleicht" -ähnliche Funktion für Bool und List?

Ich bin auf der Suche nach Funktionen für Bool und List, die sind, was die "vielleicht" -Funktion zu vielleicht ist. Sind da irgendwelche?

Update: Ich wollte den Bool-Fall als Verallgemeinerung des List-Falls verwenden. Zum Beispiel bei der Arbeit mit Data.Text als T:

Ich bin bestrebt, solche Kesselplatte Code zu reduzieren.

+1

Bitte geben ein Beispiel für diese Funktion für Bool ... – kennytm

Antwort

4

Ich denke, die Antwort ist wahrscheinlich, dass es keine solche generische Funktion gibt. Wie djv sagt, können Sie vielleicht auf Data.Monoid bauen ein, so etwas wie zu schreiben:

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 miteinander zusammengesetzt sein könnte dazu).

3

Überprüfen Sie Data.Monoid, es ist eine Typklasse, die Datentypen beschreibt, die einen festgelegten leeren Wert haben, und Sie können Muster-Match darauf schreiben, um Ihre generische Funktion zu schreiben. Es gibt Instanzen für Bool mit leerem Wert False und für List mit leerem Wert [].

6

vielleicht ist die Katamorphose des Maybe-Typs.

foldr ist die Katamorphose des Listentyps.

Wenn Sie vielleicht wie benutzt hatte: maybe x (const y)

könnten Sie verwenden: foldr (const (const y)) x

Für Bool Ich vermisse auch die catamorphism in der Standard-Bibliothek, aber es wäre:

bool :: a -> a -> Bool -> a 
bool t _ True = t 
bool _ f False = f 
+2

Die Funktion ['bool'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool) existiert in den letzten Paketen des Basispakets. –

Verwandte Themen