最近,我遇到了需要将谓词函数传递给另一个函数的情况,并且我经常寻找的逻辑本质上是“此值是否与该模式匹配?”
在声明,do
块和列表理解中,模式匹配似乎是首选,但是有许多函数采用谓词a -> Bool
,在某种情况下以某种方式传递模式非常方便。例如,takeWhile
,until
,find
,span
,等。
到目前为止,我一直在做\a -> case a of MyCons _ -> True; otherwise -> False
,或者写一个la命名函数,let myPred (MyCons _) = True; myPred _ = False in
但是它们看起来都非常丑陋,而且不是很惯用。“显而易见的”(错误的)方式将是类似的,\(MyCons _) -> True
但是由于自然而然地局部化而引发了错误,甚至感觉到必须有一种更清洁的方式。
有没有更简洁/干净的方式来执行这种事情?还是我做事完全是错误的方式?
let myPred...
样式不好,但是感觉比我想一个非常简单的想法要冗长得多,这使我想知道我是否在树错了树。
maybe :: b -> (a -> b) -> Maybe a -> b
和)定义大小写匹配(解构)函数bool :: a -> a -> Bool -> a
,然后将其与产生布尔值的函数一起用作参数。例如myCons z f (MyCons x) = f x ; myCons z f _ = z
,然后致电myCons False (const True) aMyConsValue
。这几乎就是您所写的内容,只是通过函数自变量引入了另一层“间接” /“抽象”。
let
您不喜欢的子句感到非常满意-尽管我更喜欢等效的where
子句,因此这不会使主要定义混乱。当然,如果最终不止一次需要此实用程序,则可以将其定义为顶级功能。