我有一組 Haskell IO 系結呼叫,它們回傳 Maybe Z、Maybe Y、Maybe Z,其中 X /= Y /= Z。
我想要一個回傳 Just (X,Y,Z) 的函式,其中 ALL 都只是 n,否則什么都沒有。
一個天真的實作將是
fn :: (Maybe x, Maybe y, Maybe z) -> Maybe (x,y,z)
fn (Just x, Just y, Just z) = Just (x,y,z)
fn _ = Nothing
但我想知道有沒有更優雅的解決方案?也許某種映射?
據我所知,更常見的
let x = do x <- fn1
y <- fn2
z <- fn3
return (x,y,z) :: Maybe (X,Y,Z)
不會因為 fn1-3 是 IO 系結而作業嗎?
謝謝。
uj5u.com熱心網友回復:
您不需要指定輸出型別。您可以與:
f :: Monad m => m a -> m b -> m c -> m (a, b, c)
f mx my mz = do
x <- mx
y <- my
z <- mz
return (x, y, z)
但在這里您可以使用:
f :: Applicative f => f a -> f b -> f c -> f (a, b, c)
f fa fb fc = (,,) <$> fa <*> fb <*> fc
或如@RobinZigmond 所說,使用liftA3 :: Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d:
import Control.Applicative(liftA3)
f :: Applicative f => f a -> f b -> f c -> f (a, b, c)
f = liftA3 (,,)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387037.html
