Function 将(可能a,b)转换为(可能a,b)

Function 将(可能a,b)转换为(可能a,b),function,haskell,tuples,type-conversion,maybe,Function,Haskell,Tuples,Type Conversion,Maybe,是否有一个简单的(无需重新发明轮子)从(可能是a,b)转换为可能是(a,b)。我查看了可遍历的,但无法使其工作。是的。函子 solution :: (Maybe a, b) -> Maybe (a, b) solution (a, b) = fmap (\q -> (q, b)) a 或者,以无点方式: solution = uncurry $ flip $ fmap . flip (,) 此外,正如@Bakuriu所说,如果启用了TupleSections,并导入了Contro

是否有一个简单的(无需重新发明轮子)从
(可能是a,b)
转换为
可能是(a,b)
。我查看了可遍历的,但无法使其工作。

是的。函子

solution :: (Maybe a, b) -> Maybe (a, b)
solution (a, b) = fmap (\q -> (q, b)) a
或者,以无点方式:

solution = uncurry $ flip $ fmap . flip (,)
此外,正如@Bakuriu所说,如果启用了
TupleSections
,并导入了
Control.Applicative
,那么就变得非常简单:

解决方案(a,b)=(,b)a

了解更多信息。

你说的“不重新发明轮子”是什么意思?创建此类函数最简单的方法如下所示:

f :: Maybe a -> b -> Maybe (a, b)
f Nothing  _ = Nothing
f (Just a) b = Just (a, b)

g :: (Maybe a, b) -> Maybe (a, b)
g = uncurry f
希望对您有所帮助。

您也可以使用:

专门针对

bitraverse id pure :: (Maybe a, b) -> Maybe (a, b)
以下内容适用于:


使用
-XTupleSections
你可以做一些类似的事情:
f(x,y)=(,y)x
“无需重新发明轮子”和“简单”是非常模糊的术语。对于经验丰富的Haskell程序员来说,对于初学者来说困难的概念可能非常简单。你能重新定义你的意思吗?“没有…”我的意思是不推出我自己的函数,而是使用一个已经存在的函数。“容易”:在表达式中可用。Petr
bitraverse
解决方案就是一个很好的例子。我的解决方案使用序列
fmap交换。序列swap
并没有重新发明轮子,但这不是我所认为的容易的。我的意思是,我可以写得非常简单,但我想知道这样的函数是否已经存在,因为它看起来是更一般的
(ma,b)->m(a,b)
甚至
t(ma)->m(ta)的一个特例
请注意,这与
sequenceAOf\u 1(仅1,2)相同。
。我想你喜欢哪一个是个人喜好。我非常喜欢,尽管这很难理解。
bitraverse id pure :: (Bitraversable t, Applicative f) => t (f c) d -> f (t c d)
bitraverse id pure :: (Maybe a, b) -> Maybe (a, b)
> import Control.Lens
> _1 id (Just 1, 2)
Just (1, 2)