2010-10-01 5 views
5

Parfois, je me surprends à programmer le modèle "si le Bool n'est pas faux" ou "si la liste n'est pas vide, utilisez-le, sinon utilisez autre chose".Fonction "peut-être" pour Bool et List?

Je cherche des fonctions pour Bool et List qui sont ce que la fonction "peut-être" est peut-être. Y a-t-il?

Mise à jour: Je voulais utiliser le Bool-case comme une généralisation de la List-case. Par exemple lorsque vous travaillez avec Data.Text comme T:

if T.null x then x else foo x 

Je cherche à réduire un tel code de plaque de chaudière.

+1

S'il vous plaît fournir un exemple sur cette fonction pour Bool ... – kennytm

Répondre

4

Je pense que la réponse est probablement qu'il n'y a pas une telle fonction générique. Comme DJV dit, vous pouvez peut-être construire sur Data.Monoid d'écrire un, quelque chose comme:

maybe' :: (Eq a, Monoid a) => b -> (a -> b) -> a -> b 
maybe' repl f x = if x == mempty then repl else f x 

Mais je ne connais pas toutes les fonctions de la bibliothèque standard comme ça (ou tout qui pourrait facilement être composé ensemble faire cela).

3

Cochez Data.Monoid, il s'agit d'une classe de type décrivant les types de données qui ont une valeur vide désignée et vous pouvez lui attribuer une correspondance de modèle pour écrire votre fonction générique. Il existe des instances pour Bool avec la valeur vide False et pour List avec la valeur vide [].

6

peut-être est le catamorphisme du type Maybe.

foldr est le catamorphisme du type liste.

Si vous aviez utilisé peut-être comme: maybe x (const y)

Vous pouvez utiliser: foldr (const (const y)) x

Pour Bool me manque aussi catamorphisme dans la bibliothèque standard, mais ce serait:

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

La fonction ['bool'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool) existe dans les paquets récents du paquet 'base'. –