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

Haskell中如何将含Maybe的元组转为包裹整个元组的Maybe类型?

解决方案

你要的这个函数在标准库中没有专门的命名实现,但可以用基础组合子简洁完成,不需要额外依赖第三方库:

  • 最直观的写法是利用fmap(或其操作符<$>):

    (\(x, my) -> (x,) <$> my) :: Monad m => (a, m b) -> m (a, b)
    

    这里(x,)是一个把b转换成(a,b)的函数,用fmap把它作用在m b上,就能得到包裹整个元组的m (a,b),完全匹配你的需求。

  • 也可以借助Control.Monad里的liftM实现,本质和上面一致:

    import Control.Monad (liftM)
    (\(x, my) -> liftM (x,) my)
    
  • 如果你想利用Traversable类型类的通用操作,还可以这么写:

    import Data.Traversable (traverse)
    traverse id :: Monad m => (a, m b) -> m (a, b)
    

    这是因为(a,)(固定第一个元素的二元组)是Traversable实例,traverse id会把第二个元素的monad上下文“提出来”包裹整个元组。

之所以在Hoogle上搜不到专门的函数,是因为Haskell社区更倾向于用基础组合子组合出这类操作,而非为每个细分场景单独命名函数。

内容的提问来源于stack exchange,提问作者Paul Parker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:33:32