如何将 &&& 与 -> Maybe a

问题描述 投票:0回答:2

我有两个

String -> Int
功能:

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

haskell option-type arrow-abstraction
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)


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)
© www.soinside.com 2019 - 2024. All rights reserved.