On Wednesday, 4 June 2014 at 09:43:20 UTC, bearophile wrote
You can give strong typing to indexes of a matrix library, this
doesn't need language changes. So a dynamic array library in
Phobos could fulfil most of the possible desires or needs for
strongly typed indexes. But you lose some of the convenience of
the built-in arrays, and you have to import a bulky library
that you are mostly not using.
I see several places in all kinds of D code where strongly
typed indexes can help tell things apart more clearly and
safely, but I think only in some of such situations programmers
are willing to import a numpy-like library just to have strong
typing.
I'll have to check out Ada to get a sense of how this feature
works and how people use it.
In D learn I see that people don't even add "immutable" to the
foreach variable that spans an interval.
I noticed you did that, though I haven't seen this much on
Dlang.org. Is this considered idiomatic? Coming mostly from
JavaScript/Python/CUDA C++ I'm not sure how I feel about the
terseness/safety trade-off (I can honestly see it both ways).
So I don't expect people to import numpy just to give types to
two indexes of two 1D arrays. And statistically I think such
cases of just two or tree 1D arrays are much more common than
numerical code that manages several matrices with a good matrix
library.
Good point. Though, I don't think adding compiler support for
strongly typed array dimensions is the full solution. I think
this is one part of the larger problem of representing units.
Other languages have solutions to this (I particularly like F#'s:
http://en.wikibooks.org/wiki/F_Sharp_Programming/Units_of_Measure),
and it would be very nice to see something this in Phobos:
/* User code. */
import std.awesome_unit_library: Unit, of;
// Unit: defines new types that can be multiplied & divided.
// of: wraps a container in a stricter version, enforcing units.
alias Name = Unit!"name";
alias Food = Unit!"food";
auto names = ["Fred", "Alice", "Sue"].of!Name;
auto foods = ["Apple", "Orange", "Tofu"].of!Food;
foreach (name; ["Bill", "Ted"].of!Name)
{
names ~= name; // This compiles happily.
foods ~= name; // This does not compile, preventing
// Bill and Ted from being eaten.
}