gpt4 book ai didi

haskell - 从 [Maybe Bool] 中获得一个 Bool,该 Bool 保证至少包含一个 Just

转载 作者:行者123 更新时间:2023-12-04 12:07:40 26 4
gpt4 key购买 nike

我有一个输入 list类型 [Maybe SomeType]和一个谓词 p类型 SomeType -> Bool ,我想回答这个问题“谓词 p 是否适用于所有碰巧在输入中的 SomeType ?”。
第一部分很简单:(map . fmap) p list类型为 [Maybe Bool] .
一个重要的信息是我知道 length list >= 1all isNothing list == False两者都成立,所以必须至少有一个 Just True(map . fmap) p list .
但是我怎么拉出一个单Bool不在那个名单上?
我认为我可以利用折叠(例如通过 foldl )和 MaybeMonadPlus例如,执行以下操作:

allTrueOrNothing :: [Maybe Bool] -> Bool
allTrueOrNothing = fromJust . foldl mplus mzero
但这并不完全正确,因为 mplus如果是 Just something,则返回左操作数不管怎样 something是,所以 allTrueOrNothing将返回 True即使它的输入是 [Just True, Just False] .
我可以完成任务的最干净/最惯用的方式是什么?
我明白我可以简单地 filterNothing s 然后 and一起 Just s,是这样的:
allTrueOrNothing' :: [Maybe Bool] -> Bool
allTrueOrNothing' = all fromJust . filter (fmap not isNothing)
但我更想知道是否有办法拥有这些 Maybe Bool s 表现得像 Monoid知道它的 Bool内容。

最佳答案

我只会用 all直接地:

all . all :: (a -> Bool) -> [Maybe a] -> Bool
如果由于某种原因必须具有您描述的相位差异,那么您可以使用特化 and = all id :
all and :: [Maybe Bool] -> Bool

关于haskell - 从 [Maybe Bool] 中获得一个 Bool,该 Bool 保证至少包含一个 Just,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69165126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com