Currently modules and types occupy distinct namespaces. I propose that we merge them into one. The main reason to do this is that we can write something like:

import foo::bar::MyType;
...
let instance = MyType::new()

where `new()` is a static fn (hereafter, selfless fn, because it is technically accurate but also mildly amusing). This resolves the constructor naming issue. It also changes how selfless fn names work: rather than floating out to the containing module, they would be contained within their type (which seems more natural). Coherence makes this well-defined; inherent selfless fns are associated with their inherent type, and selfless fns that fulfill a trait can be invoked via the trait version.

Currently have a number of modules named after the primitive types, e.g., uint::max(). These can be rewritten as static functions. In fact, they probably *should* be static functions on some kind of `Number` or `Integer` trait anyhow. As a side benefit, we can make `uint`, `int`, and other primitive type names true keywords.

It should be possible to import selfless fns as normal. With some more effort, we could also allow importing non-selfless fns—this would yield a function where the receiver is the first argument. This should help satisfy the desire expressed by various Haskell programmers to avoid dot notation. It would also sometimes be useful for higher-order functions.

For example, `max()` can be defined as a method like so:

trait Number {
fn max(self, other: self) -> self;
}

and then used as follows:

num_a.max(num_b)

or as follows:

import Number::max;
...
max(num_a, num_b)

whichever is more convenient or more aesthetically pleasing.


Niko
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to