Recientemente me he encontrado con situaciones en las que necesito pasar una función de predicado a otra función, y con frecuencia la lógica que estoy buscando es esencialmente "¿este valor coincide con este patrón?"
La coincidencia de patrones parece preferirse en declaraciones, dobloques y comprensiones de listas, pero hay una serie de funciones que toman un predicado a -> Bool, donde sería muy útil pasar de alguna manera un patrón. Por ejemplo, takeWhile, until, find, span, etc.
Hasta ahora he estado haciendo \a -> case a of MyCons _ -> True; otherwise -> False, o escribiendo una función con nombre a la let myPred (MyCons _) = True; myPred _ = False inpero ambos parecen terriblemente feos y no muy idiomáticos. La forma "obvia" (e incorrecta) sería algo así, \(MyCons _) -> Truepero arroja un error por ser parcial, naturalmente, e incluso entonces parece que debe haber una forma más limpia.
¿Hay una manera más sucinta / limpia de hacer este tipo de cosas? ¿O estoy yendo por cosas completamente equivocadas?
let myPred...estilo es malo , pero se siente mucho más detallado de lo que esperaría para una idea muy simple, lo que me lleva a preguntarme si estoy ladrando el árbol equivocado.
maybe :: b -> (a -> b) -> Maybe a -> by bool :: a -> a -> Bool -> a, luego, usarla con funciones productoras de Boole como argumento (s). por ejemplo myCons z f (MyCons x) = f x ; myCons z f _ = z, luego llame myCons False (const True) aMyConsValue. esto es casi lo que escribió, solo tiene un nivel más de "indirección" / "abstracción" a través de argumentos funcionales, integrado en él.
letcláusula que no le gusta, aunque prefiero lawherecláusula equivalente para que esto no sature la definición principal. Por supuesto, si termina necesitando esta utilidad más de una vez, la definiría como una función de nivel superior.