AtCoder Beginner Contest 256 C

https://atcoder.jp/contests/abc256/tasks/abc256_c

こうすると怒られます。

    if hs.iter().sum() != ws.iter().sum() {
40   |     if hs.iter().sum() != ws.iter().sum() {
     |                  ^^^ cannot infer type for type parameter `S` declared on the associated function `sum`

なぜ型を推定できないのかよくわかりませんが、次のように型を指定すれば通ります。

    if hs.iter().sum::<i32>() != ws.iter().sum() {
// Filling 3x3 array
#![allow(non_snake_case)]

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>().split_whitespace()
            .map(|e| e.parse().ok().unwrap()).collect()
}

fn read_input() -> (Vec<i32>, Vec<i32>) {
    let v = read_vec();
    (vec![v[0], v[1], v[2]], vec![v[3], v[4], v[5]])
}

fn collect_pairs(h: i32) -> Vec<(i32, i32)> {
    let mut pairs = Vec::<(i32, i32)>::new();
    for n1 in 1..(h-1) {
        for n2 in 1..(h-n1) {
            pairs.push((n1, n2))
        }
    }
    pairs
}

fn f(hs: Vec<i32>, ws: Vec<i32>) -> usize {
    let is_satisfied = |a11: i32, a12: i32, a21: i32, a22: i32| -> bool {
        let a13 = hs[0] - a11 - a12;
        let a23 = hs[1] - a21 - a22;
        let a31 = ws[0] - a11 - a21;
        let a32 = ws[1] - a12 - a22;
        let a33 = ws[2] - a13 - a23;
        a13 > 0 && a23 > 0 && a31 > 0 && a32 > 0 && a33 > 0
    };
    
    if hs.iter().sum::<i32>() != ws.iter().sum() {
        return 0
    }
    
    let pairs1 = collect_pairs(hs[0]);
    let pairs2 = collect_pairs(hs[1]);
    let mut counter: usize = 0;
    for (a11, a12) in pairs1.iter() {
        for (a21, a22) in pairs2.iter() {
            if is_satisfied(*a11, *a12, *a21, *a22) {
                counter += 1
            }
        }
    }
    counter
}

fn main() {
    let v = read_input();
    let hs = v.0;
    let ws = v.1;
    println!("{}", f(hs, ws))
}