haskell - 如何组合将布尔值返回给一个函数的函数
问题描述
我在这里发现了一个类似的问题,它问的问题几乎相同,但不完全一样。
我的问题是如何将(a -> Bool)类型的函数列表组合成一个也是(a -> Bool)的函数。
前任。
compose :: [(a -> Bool)] -> (a -> Bool)
compose [] = **?**
compose (x:xs) = x **?** compose xs
与此类似的问题是采用三个函数并将它们混合在一起:
newFunction x f g y = f x || g x || y x
但这非常有限,因为您必须提供特定数量的函数,并且它不返回另一个函数,它返回一个布尔值。我本质上想要一个函数,它给我上面的函数,没有函数作为参数。
我尝试使用 Monoids 来完成这项工作,但我首先遇到了将函数包装到 Monoid 中的问题,更不用说像newFunction那样将它们实际组合在一起了。
有没有办法将类型 (a -> Bool) 的函数列表组成一个相同类型的函数?
解决方案
我们可以在any :: Foldable => (a -> Bool) -> f a -> Bool
这里使用:
compose :: Foldable f => f (a -> Bool) -> a -> Bool
compose = flip (any . flip ($))
或如@chepner建议的那样,使用(&)
:
import Data.Function((&))
compose :: Foldable f => f (a -> Bool) -> a -> Bool
compose = flip (any . (&))
或没有无点样式(可能更容易理解):
compose :: Foldable f => f (a -> Bool) -> a -> Bool
compose l x = any ($ x) l
以上内容适用于任何类型的Foldable
,例如 list []
、Maybe
等。
推荐阅读
- reactjs - 有人可以帮我将代码笔转换为反应沙盒小提琴吗?
- php - 什么可能导致 xdebug 的 remote_host 设置被忽略
- r - 如何在评估他的内容后有条件地排除一个块?
- angular - 如何检查Angular反应形式中的所有复选框
- ms-access - MS-Access 中计数值的百分比
- javascript - 如何使用 JavaScript 将 csv 文件从 NetSuite 中的文件柜传递到 ftp 服务器?
- cordova - 升级到 Android Pie 后不会发生 onregistered 事件
- c - 如何设计测试用例来验证数据包解码器的节流能力?
- javascript - 如何在 React 应用程序中执行 Python 代码?
- awk - 如何使用 awk 连接特定行?