You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从含至少一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:09:02