使用谓词将值提升至Maybe类型:Haskell中是否已有此类函数?
Haskell中基于谓词转换为Maybe的函数
嘿,这个需求挺常见的!Haskell标准库(base)里虽然没有一个专门起好名字的函数直接完成你说的“满足谓词返回Just值,不满足返回Nothing”的操作,但实现起来超简单,而且有几种不同的写法可选:
1. 最直观的自定义函数
直接写个小函数是最清晰的方式,一眼就能看懂:
maybeIf :: (a -> Bool) -> a -> Maybe a maybeIf predicate value = if predicate value then Just value else Nothing
用的时候就像这样:
-- 比如筛选偶数,返回Just偶数,否则Nothing maybeIf even 4 -- 结果是 Just 4 maybeIf even 5 -- 结果是 Nothing
2. 用Data.Bool的bool组合子
如果你喜欢用更函数式的组合方式,可以用Data.Bool模块里的bool函数(它的作用是根据布尔值选择两个值中的一个),把它和Just结合起来:
import Data.Bool (bool) maybeIf :: (a -> Bool) -> a -> Maybe a maybeIf p = bool Nothing . Just <*> p
这个写法稍微简洁一点,本质和上面的if表达式是一样的。
3. 用Monad风格的guard
如果你熟悉Haskell的Monad系统,也可以用Control.Monad里的guard来实现——因为Maybe本身是个Monad,guard在条件不满足时会返回Nothing,满足时继续执行后续的return:
import Control.Monad (guard) maybeIf :: (a -> Bool) -> a -> Maybe a maybeIf p x = do guard (p x) return x
这种写法更偏向于Monad的“流程控制”风格,适合已经习惯do记法的开发者。
其实在日常代码里,很多人会直接写inline的if表达式(比如if even x then Just x else Nothing),而不是专门定义这个函数——毕竟逻辑太简单了,没必要多一个函数调用。但如果你在代码里频繁用到这个逻辑,定义一个maybeIf之类的函数能让代码更整洁。
内容的提问来源于stack exchange,提问作者Michiel Borkent
相关产品推荐
相关产品推荐

