2010-10-01 26 views
5

A veces me encuentro programando el patrón "si el Bool no es falso" o "si la lista no está vacía úsala, de lo contrario utiliza otra cosa".Función "tal vez" como para Bool y List?

Estoy buscando funciones para Bool y Lista que son lo que la función "tal vez" es Quizás. ¿Hay alguno?

Actualización: Quise utilizar el caso Bool como una generalización del List-case. Por ejemplo, cuando se trabaja con Data.Text como T:

if T.null x then x else foo x 

Estoy buscando reducir el código de la placa de la caldera.

+1

Sírvanse un ejemplo sobre esa función para Bool ... – kennytm

Respuesta

4

Creo que la respuesta es probablemente que no existe una función tan genérica. Como dice DJV, puede quizá construir sobre Data.Monoid a escribir uno, algo así como:

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

Pero no sé de cualquiera de las funciones de la biblioteca estándar de esa manera (o cualquier que podría ser fácilmente integrado en conjunto para hacerlo).

3

Compruebe Data.Monoid, es una clase de tipo que describe los tipos de datos que tienen un valor vacío designado y puede hacer coincidir los patrones para escribir su función genérica. Hay instancias para Bool con el valor vacío False y para List con el valor vacío [].

6

quizás es el catamorfismo del tipo Maybe.

foldr es el catamorfismo del tipo de lista.

Si se hubiera usado tal como: maybe x (const y)

que puede usar: foldr (const (const y)) x

Para Bool También se pierda la catamorphism en la biblioteca estándar, pero sería:

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

Existe la función ['bool'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bool.html#v:bool) en paquetes recientes del paquete 'base'. –

Cuestiones relacionadas