62044

[code]

    fn fib<T>(a: T, b: T, n: usize) -> T
    where
        T: std::ops::Add,
        // <T as std::ops::Add>::Output == T ???
    {
        match n {
            0 => a,
            1 => b,
            _ => fib(a, b, n-1) + fib(a, b, n-2)
        }
    }
    
    // (計算量については突っ込まないでください)
    
[/code]

このような計算をする場合、`T`+`T`->`T`であることをコンパイラに知らせる必要がありますが、その方法はありますか。


CC BY-SA 4.0
2020-01-07T13:19:15.403
62043
2020-01-07T13:46:08.860
20885
question
rust
Rustのジェネリックで関連型が特定の型であることを保証する方法


`<Output = T>`のように関連型の型を指定できる記法があります(コンパイルを通すために`Copy`も付加しました)．

[code]

    fn fib<T>(a: T, b: T, n: usize) -> T
    where
        T: std::ops::Add<Output = T> + Copy,
    {
        match n {
            0 => a,
            1 => b,
            _ => fib(a, b, n-1) + fib(a, b, n-2)
        }
    }
    
[/code]


CC BY-SA 4.0
2020-01-07T13:46:08.860
62044
2020-01-07T13:46:08.860
8573
62043
answer