如何在 -> Maybe a 中使用 &&&?

4

我有两个函数

f1:: String -> Int
f2:: String -> Int

f3:: String -> (Int,Int)    
f3 = f1 &&& f2

然后它们被更改为String -> Maybe Int。

f1:: String -> Maybe Int
f2:: String -> Maybe Int

f3:: String -> (Maybe Int,Maybe Int)    

有没有一种无点方式来获取函数?
f4:: String -> Maybe (Int, Int)

如果f1和f2都返回Just,那么f4也会返回Just,否则返回Nothing。
2个回答

8
import Control.Arrow
import Control.Applicative

h :: (Applicative f) => (a -> f b) -> (a -> f c) -> a -> f (b, c)
h = liftA2 (liftA2 (,))

相当于 h f g x = liftA2 (,) (f x) (g x)


太酷了!我宁愿使用ApplicativeliftA2 - phadej

2

您可以使用liftA2获取无参版本,但我不确定无参版本是否值得麻烦:

λ> :t \f1 f2 -> uncurry (liftA2 (,)) . (f1 &&& f2)
\f1 f2 -> uncurry (liftA2 (,)) . (f1 &&& f2)
  :: Applicative f => (b1 -> f a) -> (b1 -> f b) -> b1 -> f (a, b)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接