小编Sat*_*mar的帖子

结合两个任一个 Monad 的结果

你如何在 Haskell 中处理这种情况(下面提供的伪代码)?

 x = somethingThatReturnsMaybe(s1)
 y = somethingThatReturnsMaybe(s2)

 if(x == Nothing) return Left "invalid x"
 if(y == Nothing) return Left "invalid y"

 callFn(fromJust(x), fromJust(y));

Run Code Online (Sandbox Code Playgroud)

我可以想到两种方法:-

  1. 从调用处传递Maybes,这样上面的代码就可以包装在一个函数中,我可以在函数绑定/定义中使用模式匹配。
  2. 我已经编写了这段代码来使用任一组合这些值
mapToRight (\(x, y) -> callFn x y) combined_values
                where { combined_values = (maybeToRight "Invalid x!" x >>= combiner) <*>
                                        maybeToRight "Invalid target position" y;
                mapToRight = second; x = somethingThatReturnsMaybe s1; y = somethingThatReturnsMaybe s2
                }

Run Code Online (Sandbox Code Playgroud)

对于第二个选项,我有以下组合器

combiner :: b -> Either a (b0 -> (b, b0));
combiner x = Right (x,) …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming

2
推荐指数
1
解决办法
81
查看次数

标签 统计

functional-programming ×1

haskell ×1