Data.Set的`any`函数

时间:2013-10-07 10:28:43

标签: haskell

我需要检查集合中的任何元素是否满足谓词。到目前为止,我一直在使用列表,所以我只使用了

any myPredicate sx

但在我的情况下使用集合在语义上更正确(并且可能更有效)。但是对于集合没有any,我最终会得到很多这样的行(Data.Set as S):

any myPredicate $ S.toList mySet

有没有办法不让我的代码乱丢所有这些转换,比如monoids等......?

(我的意思是,除了定义anyS p s = any p $ S.toList s之外必须有一种方法,否则为什么它不在Data.Set ...?)

2 个答案:

答案 0 :(得分:7)

怎么样

import qualified Data.Set as Set
import           Data.Set (Set)

orS :: Set Bool -> Bool
orS = Set.foldr (||) False

anyS :: (a -> Bool) -> Set a -> Bool
anyS p = orS . Set.map p

或者更简单,因为SetFoldable

import qualified Data.Foldable as F

anyS :: (a -> Bool) -> Set a -> Bool
anyS = F.any

答案 1 :(得分:2)

import Data.Set (Set)
import qualified Data.Set as Set

anyS :: (a -> Bool) -> Set a -> Bool
anyS predicate s = not $ Set.null $ Set.filter predicate s