【问题标题】:Haskell (Maybe, x, Maybe y, Maybe z) -> Maybe (x,y,z)Haskell (Maybe, x, Maybe y, Maybe z) -> Maybe (x,y,z)
【发布时间】:2022-01-12 20:33:30
【问题描述】:

我有一组 Haskell IO 绑定调用,它们返回 Maybe Z、Maybe Y、Maybe Z,其中 X /= Y /= Z。

我想要一个返回 Just (X,Y,Z) 的函数,其中 ALL 都是 Just 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 限制而无法工作?

谢谢。

【问题讨论】:

  • 您是否尝试过“更常见”的方法?它奏效了吗?如果没有,出了什么问题?

标签: haskell monads maybe


【解决方案1】:

您不需要指定输出类型。您可以使用:

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 saysliftA3 :: Applicative f =&gt; (a -&gt; b -&gt; c -&gt; d) -&gt; f a -&gt; f b -&gt; f c -&gt; f d

import Control.Applicative(liftA3)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多