我需要检查集合中的任何元素是否满足谓词。到目前为止,我一直在使用列表,所以我只使用了
any myPredicate sx
但在我的情况下使用集合在语义上更正确(并且可能更有效)。但是对于集合没有any
,我最终会得到很多这样的行(Data.Set as S
):
any myPredicate $ S.toList mySet
有没有办法不让我的代码乱丢所有这些转换,比如monoids等......?
(我的意思是,除了定义anyS p s = any p $ S.toList s
之外必须有一种方法,否则为什么它不在Data.Set
...?)
答案 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
或者更简单,因为Set
是Foldable
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