Recentemente, estive enfrentando situações em que preciso passar uma função predicada para outra função, e muitas vezes a lógica que estou procurando é essencialmente "esse valor corresponde a esse padrão?"
A correspondência de padrões parece ser preferida em declarações, doblocos e compreensões de lista, mas há várias funções que usam um predicado a -> Bool, nas quais seria muito útil passar de alguma forma em um padrão. Por exemplo, takeWhile, until, find, span, etc.
Até agora eu venho fazendo \a -> case a of MyCons _ -> True; otherwise -> Falseou escrevendo uma função nomeada à la, let myPred (MyCons _) = True; myPred _ = False inmas ambas parecem terrivelmente feias e não muito idiomáticas. O caminho "óbvio" (e errado) seria algo parecido, \(MyCons _) -> Truemas isso gera um erro por ser parcial, naturalmente, e mesmo assim parece que deve haver um caminho mais limpo.
Existe uma maneira mais sucinta / limpa de fazer esse tipo de coisa? Ou estou fazendo as coisas da maneira errada?
let myPred...estilo é ruim , mas parece muito mais detalhado do que eu esperaria de uma idéia muito simples, o que me leva a pensar se estou latindo na árvore errada.
maybe :: b -> (a -> b) -> Maybe a -> be bool :: a -> a -> Bool -> a, em seguida, usá-la com funções de produção booleana como argumento (s). por exemplo myCons z f (MyCons x) = f x ; myCons z f _ = z, então ligue myCons False (const True) aMyConsValue. isto é quase o que você escreveu, apenas possui mais um nível de "indireção" / "abstração" por meio de argumentos funcionais, inseridos nele.
letcláusula que você não gosta - embora eu prefira awherecláusula equivalente para que isso não atrapalhe a definição principal. Obviamente, se você precisar deste utilitário mais de uma vez, você o definiria como uma função de nível superior.