【问题标题】:Multi-input monadic functions with currying in HaskellHaskell中带有currying的多输入一元函数
【发布时间】:2020-09-01 15:09:06
【问题描述】:

我有这样的功能

foo :: X -> Y -> Z

我有两个单独的计算来获得XY 类型的变量,但它们可能会失败,所以我使用了 Maybe

calc1 :: A -> Maybe X
calc2 :: B -> Maybe Y

现在我不确定如何使用 monad 操作来获得所需的行为

safe_foo :: Maybe X -> Maybe Y -> Maybe Z
safe_foo Nothing _ = Nothing
safe_foo _ Nothing = Nothing
safe_foo (Just x) (Just y) = Just (foo x y)

最好的方法是什么?

【问题讨论】:

    标签: haskell monads currying


    【解决方案1】:

    您只需要liftA2,它被定义为Applicative 类型类的一部分。

    safe_foo = liftA2 foo
    

    或者,在“应用风格”中:

    safe_foo mx my = foo <$> mx <*> my
    

    【讨论】:

      【解决方案2】:

      您可以将 monad 与 do 块一起使用

      safe_foo mx my = do    -- BTW, we underscore_case is unconventional in Haskell,
         x <- mx             -- preferrably use camelCase instead
         y <- my
         return $ foo x y
      

      ...或者,脱糖和简化,

      safe_foo mx my = mx >>= (<$>my) . foo
      

      但这里真的不需要MonadApplicative 就足够了。

      safe_foo = liftA2 foo
      

      或直接使用计算函数,

         foo <$> calc1 a <*> calc2 b
      

      【讨论】:

      • 请原谅我的无知,my 在脱糖示例中去了哪里?
      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多