Haskell 我如何使用&&&;使用a->;也许是

Haskell 我如何使用&&&;使用a->;也许是,haskell,arrows,maybe,Haskell,Arrows,Maybe,我有两个功能 f1:: String -> Int f2:: String -> Int f3:: String -> (Int,Int) f3 = f1 &&& f2 然后它们被更改为字符串->可能是Int f1:: String -> Maybe Int f2:: String -> Maybe Int f3:: String -> (Maybe Int,Maybe Int) 有没有获得函数的无点方法 f4:

我有两个功能

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

f3:: String -> (Int,Int)    
f3 = f1 &&& f2
然后它们被更改为字符串->可能是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,否则什么都不会返回。您可以使用
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)

这等于
hfgx=liftA2(,)(fx)(gx)

酷!不过,我宁愿使用
Applicative
liftA2
import Control.Arrow
import Control.Applicative

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