Rust是否具有Haskell的`sequence`功能?

时间:2015-11-06 11:56:31

标签: error-handling rust

我正在Vec进行映射,以使每个项目成为Result。如果任何元素是Err,那么我想提前终止并生成Err,否则我想生成包含Ok的{​​{1}}。

Vec<i32>

在Haskell中,我可以使用let v = (1..10) .map( |n| { if n % 4 == 0 { Err("Too fourish!") } else { Ok(n) } }).collect::<Vec<_>>(); println!("{:?}", v); 。是否有相同的内置Rust功能?

1 个答案:

答案 0 :(得分:5)

您可以使用FromIterator的{​​{1}}实现:

Result

输出:

fn main() {
    let v = (1..10)
        .map( |n| {
            if n % 4 == 0 {
                Err("Too fourish!")
            }
            else {
                Ok(n)
            }
        }).collect::<Result<Vec<_>, _>>();
    println!("{:?}", v);

    let v = (1..10)
        .map( |n| {
            if n % 4 == 4 { // impossible
                Err("Too fourish!")
            }
            else {
                Ok(n)
            }
        }).collect::<Result<Vec<_>, _>>();
    println!("{:?}", v);
}

更多信息:https://doc.rust-lang.org/std/result/enum.Result.html#implementations