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
相关产品推荐
相关产品推荐

