« Peut-être » -comme fonction pour Bool et la liste?
-
27-09-2019 - |
Question
Quelquefois, je me Progamming le modèle « si le Bool est pas faux » ou « si la liste est vide, il utilise pas, sinon utiliser quelque chose d'autre ».
Je cherche des fonctions pour Bool et la liste qui sont ce que la fonction « peut-être » est peut-être. Y at-il?
Mise à jour: Je voulais utiliser le Bool cas comme une généralisation de la liste des cas. Par exemple lorsque vous travaillez avec data.text comme T:
if T.null x then x else foo x
Je cherche à réduire ce code plaque de la chaudière.
La solution
Je pense que la réponse est sans doute qu'il n'y a pas une telle fonction générique. Comme le dit DJV, 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 pour le faire).
Autres conseils
est peut-être le catamorphisme du type Maybe.
foldr est le catamorphisme du type de 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 il serait:
bool :: a -> a -> Bool -> a
bool t _ True = t
bool _ f False = f
Vérifier Data.Monoid , c'est une description des types de classe de types de données qui ont une valeur vide désignée et vous pouvez modèle match sur elle pour écrire votre fonction générique. Il y a des cas pour Bool
avec False
valeur vide et List
avec []
valeur vide.