我有一个 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)