首页 > 解决方案 > 如何组合将布尔值返回给一个函数的函数

问题描述

我在这里发现了一个类似的问题,它问的问题几乎相同,但不完全一样。

我的问题是如何将(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) 的函数列表组成一个相同类型的函数?

标签: haskellfunctional-programmingmonoids

解决方案


我们可以在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等。


推荐阅读