I normally prefer using `std::num::{cast, zero}` as its a tad more readable. So:
use std::num;
fn average<T:Int>(values: &[T]) -> T {
values.iter()
.fold(num::zero::<T>(), |x, y| x.add(y))
.div(&num::cast(values.len()))
}
fn main() {
print!("{}", average([1,2,3]))
}
On 25/09/2013, at 8:09 AM, Scott Lawrence <[email protected]> wrote:
> Use NumCast::from(count).
>
> You'll also want to be sure to initialize sum. I'd use the Zero instance.
>
> use std::num::Zero;
> fn average<T:Int>(values:&[T]) -> T {
> let count = values.len();
> let mut sum:T = Zero::zero();
> for v in values.iter() {
> sum = sum.add(v);
> }
> return sum / NumCast::from(count);
> }
> fn main() {
> println(fmt!("%d", average([1,2,3])))
> }
>
> On Wed, 25 Sep 2013, Andreas Zwinkau wrote:
>
>> I tried to write an average function, but so far failed to convince
>> the type checker.
>>
>> fn average<T:Int>(values:&[T]) -> T {
>> let count = values.len();
>> let mut sum:T;
>> for v in values.iter() {
>> sum = sum.add(v);
>> }
>> return sum / count;
>> }
>>
>> error: mismatched types: expected `T` but found `uint` (expected type
>> parameter but found uint)
>>
>> The problem is that sum is the generic type T, but count is uint due
>> to the definition of the len function. Casting "count as T" should
>> work, i thought, but rustc seems to have another opinion?
>>
>>
>> --
>> Andreas Zwinkau
>>
>> work email: [email protected]
>> private email: [email protected]
>> homepage: http://beza1e1.tuxen.de
>> _______________________________________________
>> Rust-dev mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/rust-dev
>>
>
> --
> Scott Lawrence
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev