我有一个 Swift Result 数组,如下所示:

let tuple: [Result<Term, TermError>] = /* code here */

我想把它翻过来,把结果拉出来给出一个结果,把数组推到里面。
let tuple2: Result<[Term], TermError> = /* How? */

如果 tuple2 的任何 .failure ,那么 tuple 应该是 .failure 。否则它是 .success([tuple-elements-in-here])

我想我可以想出一些能让这项工作发挥作用的东西,但我觉得应该有一种相当干净的方法来实现这一目标?

最佳答案

您实际上只是想为 sequence monad 在 Swift 中为 Haskell Monads 重新创建 Result 函数。我们可以用完全相同的方式来实现它 Haskell implemented it

sequence       :: Monad m => [m a] -> m [a]
sequence       =  foldr mcons (return [])
                    where mcons p q = p >>= \x -> q >>= \y -> return (x:y)

在 Swift 中,这看起来像:
func sequence<T, E: Error>(_ arrayOfResults: [Result<T, E>]) -> Result<[T], E> {
    return arrayOfResults.reduce(.success([])) { (p, q) in
        return p.flatMap { x in return q.map { y in return x + [y] } }
    }
}

用法:
let tuple2 = sequence(tuple)

10-06 13:39
查看更多