有没有一种方便的方法来使用模式作为谓词函数?

Dav*_*son 10 haskell

我最近遇到了需要将谓词函数传递给另一个函数的情况,而且我所寻找的逻辑通常基本上是“这个值是否与这个模式匹配?”

模式匹配似乎在声明、do块和列表推导式中更受欢迎,但有许多函数采用谓词a -> Bool,以某种方式传入模式会非常方便。例如,takeWhileuntilfindspan,等。

到目前为止,我一直在做\a -> case a of MyCons _ -> True; otherwise -> False,或者写一个命名函数,let myPred (MyCons _) = True; myPred _ = False in但它们看起来都非常丑陋而且不太惯用。“明显的”(和错误的)方式会是这样的,\(MyCons _) -> True但是这会因为偏袒而自然而然地引发错误,即使如此,感觉也必须有一种更清洁的方式。

有没有更简洁/干净的方法来做这种事情?还是我完全以错误的方式处理事情?

Iza*_*iss 7

您可以使用语言扩展 LambdaCase 来使用\case MyCons _ -> True; _ -> False,尽管这不会保存那么多字符。

我相信你可以编写一系列函数constructedWith :: (Generic a) => (b -> a) -> a -> BoolconstructedWith2 :: (Generic a) => (b -> c -> a) -> a -> Bool但是我没有足够的能力在没有几个小时测试的情况下使用泛型来实现它。我会尝试这个,如果我能弄清楚,或者它是否是死胡同,请编辑我的答案。

编辑:是的,你可以做到!这是我的代码的链接,它从头开始实现:

https://repl.it/@lalaithion/ConstructedWith

但是,对所有通用代码管道使用类似http://hackage.haskell.org/package/generic-deriving-1.13.1/docs/Generics-Deriving-ConNames.html 之类的东西可能会更好。