我有一个 type 的输入list
和一个 type的[Maybe SomeType]
谓词,我想回答“谓词是否适用于所有恰好在输入中的 s?”这个问题。.p
SomeType -> Bool
p
SomeType
第一部分很简单:(map . fmap) p list
是[Maybe Bool]
.
一个重要信息是我知道length list >= 1
并且all isNothing list == False
两者都成立,所以必须至少有一个Just True
in (map . fmap) p list
。
但是我如何Bool
从该列表中取出一个单曲呢?
我认为我可以利用折叠(例如 via foldl
)和Maybe
' 的MonadPlus
实例,执行以下操作:
allTrueOrNothing :: [Maybe Bool] -> Bool
allTrueOrNothing = fromJust . foldl mplus mzero
但这并不完全正确,因为如果它不管是什么都mplus
返回左操作数,所以即使它的输入是也会返回。Just something
something
allTrueOrNothing
True
[Just True, Just False]
我可以完成任务的最干净/最惯用的方式是什么?
我看到我可以简单地filter
取出Nothing
s,然后将 sand
放在一起Just
,如下所示:
allTrueOrNothing' :: [Maybe Bool] -> Bool
allTrueOrNothing' = all fromJust . filter (fmap not isNothing)
但我更想知道是否有办法让这些Maybe Bool
s 表现得像Monoid
知道它的Bool
内容一样。