On Tuesday, May 28, 2013 08:55:10 Russel Winder wrote:
> Arising from a thread on the GoLangNuts email list, I wrote the
> following:
> 
>         import std.algorithm: reduce;
>         import std.bigint;
>         import std.range: iota;
>         import std.stdio: writeln;
> 
>         int main(immutable string[] args) {
>           foreach (int i; iota(10, 50, 10)) {
>             writeln(reduce!"a * b"(BigInt(1), iota(BigInt(1),
>         BigInt(i))));
>           }
>           return 0;
>         }
> 
> Sadly the compiler refuses to acknowledge that iota works for BigInt. My
> first assumption is that my code is wrong. My second assumption is that
> std.range doesn't work with real integers — as opposed to those pesky
> limited hardware things ;-)

The problem is simple enough. iota doesn't currently try and work with any 
type that has addition (like it probably should). It specifically only works 
with integers, floating point values, and pointers.  BigInt is not an integral 
type as far as std.traits is concerned. Only the built-in integer types are 
integral types as far as it's concerned. What's required is a different trait 
that tests that a type has arithmetic operations or for iota to simply test 
that the type has + or += or whatever it needs internally. Then iota can have 
an overload that works on any type that has the necessary operations.

- Jonathan m Davis

Reply via email to