从含至少一个Just的[Maybe Bool]中提取目标布尔值的实现方法
实现方案
1 从原始输入直接处理(最符合Haskell习语)
不需要先生成[Maybe Bool]中间结果,直接用maybe高阶函数就能一步满足需求:
allPredicateHold :: (a -> Bool) -> [Maybe a] -> Bool allPredicateHold p = all $ maybe True p
逻辑说明:maybe True p对Nothing直接返回True(不会影响all的与运算结果),对Just x返回p x,完全匹配「所有非空值都满足谓词」的要求。
2 针对[Maybe Bool]的Monoid实现(符合你要求的Monoid方案)
你想要的感知内部Bool值的Monoid方案可以通过Data.Monoid的All类型实现:
import Data.Monoid (All(..)) import Data.Maybe (fromJust) allTrueOrNothing :: [Maybe Bool] -> Bool allTrueOrNothing = getAll . fromJust . mconcat . map (fmap All)
原理说明:
All是Bool的Monoid封装,mappend行为为逻辑与,刚好对应「所有值为真才返回真」的需求- 当
Maybe包裹的类型本身是Monoid时,Maybe的Monoid实例会自动合并内部值:Nothing作为单位元不影响结果,两个Just会对内部的Monoid值做mappend运算 - 你已经保证输入至少存在一个
Just,因此mconcat结果必然是Just,fromJust调用是安全的
补充说明
你给出的过滤实现存在语法错误,修正后的版本如下:
import Data.Maybe (isJust, fromJust) allTrueOrNothing' :: [Maybe Bool] -> Bool allTrueOrNothing' = all fromJust . filter isJust
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

