News for hackers. Stuff that matters.
Re:Some notes on Rust by gcv on Sunday February 01, 2015 @09:44AM (#8979998)
Rust's error handling looks like the Maybe monad. That seems pretty reasonable in Haskell. I'm a little surprised by the criticism in the article — is the author saying there isn't enough syntactic sugar?
Re:Some notes on Rust by steveklabnik on Sunday February 01, 2015 @09:55AM (#8980026)
It's similar. We don't have HKT, so we can't get fully generic monads, but you can implement specific instances, like we have with Option/Result.
Re:Some notes on Rust by mafribe on Sunday February 01, 2015 @03:01PM (#8981408)
Steve, what's the reason that Rust doesn't have HKTs (higher-kinded types). Is there a technical barrier, e.g. to do with life-time inference, or is it a philosophical choice not to have them?
Re:Some notes on Rust by steveklabnik on Sunday February 01, 2015 @03:07PM (#8981426)
It's one of our most requested features (and would be really good for collections) but it should be backwards compatible and therefore was postponed until after 1.0.

Nobody has put in the work to actually make a formal RFC yet either, which is required.

Re:Some notes on Rust by NotableAlamode on Sunday February 01, 2015 @03:16PM (#8981461)
Is anybody actively working on this? I suspect that doing this well is non-trivial. Neither Tofte/Talpin nor Cyclone, both of which heavily inspired Rust's lifetimes, have HKTs as far as I'm aware.
Re:Some notes on Rust by steveklabnik on Sunday February 01, 2015 @03:39PM (#8981561)
Everything is focused on shipping a good 1.0, so no.
Re:Some notes on Rust by NotableAlamode on Monday February 02, 2015 @04:42AM (#8983430)
I understand that 1.0 was / is a priority. But I wonder what the state of discussions about HKTs in Rust is: is this addition believed to be an easy problem in the sense that it may be a lot of work, but no major roadblocks are expected? Or are there open questions that require substantial research?
Re:Some notes on Rust by steveklabnik on Monday February 02, 2015 @05:02AM (#8983480)
The state is, "this should be backwards compatible, therefore, we don't need to think about it more until after 1.0." That's pretty much it. There isn't an active discussion, because we're actively discussing the things needed to ship 1.0.
Re:Some notes on Rust by falcolas on Sunday February 01, 2015 @11:34AM (#8980516)
My experience mirrors the author's: it results in a lot of use of macros and case statements. These create a fair bit of cognitive overhead to discern what the program flow will end up being, and special syntax for unpacking values.

The broad use of case statements leads to one more odd problem - knowing when, and when not, to use a `;`. Explicit returns are frowned upon, they prefer the "results from the last expression" form of returns. The `;` results in an expression returning a different value and a different type. The type system will usually catch these errors and print a helpful "perhaps you should remove the ';' from this line" message, but it's an extra bit of cognitive overhead induced by case statements.

Ultimately, I think it's less about missing syntactic sugar, and more about the type system acting like an electric fence instead of a hedge in its efforts to guide the user to their destination.

Re:Some notes on Rust by pcwalton on Sunday February 01, 2015 @11:44AM (#8980576)
> Explicit returns are frowned upon

That's not true in any of the code I write. I prefer explicit returns in all of my Rust code. The only time I use the "result from last expression" return is when it's the last statement in the function.

The recommended way to deal with errors in Rust is "try!". Using "try!" essentially gives you the ergonomics of exceptions. You should prefer that to match or .and_then(), which are verbose.

Re:Some notes on Rust by burntsushi on Sunday February 01, 2015 @01:17PM (#8980983)
Explicit returns are not frowned upon. I don't know where you got that idea. The only thing I can think is that this:

    fn foo() -> bool {
        true
    }
is preferred over

    fn foo() -> bool {
        return true
    }
But that's more of a style issue.

As for `;`, it's just like Standard ML. `;` is for sequencing expressions. I love it.

Re:Some notes on Rust by falcolas on Sunday February 01, 2015 @01:47PM (#8981102)
> Explicit returns are not frowned upon. I don't know where you got that idea

From the docs:

http://doc.rust-lang.org/book/functions.html

> Using a `return` as the last line of a function works, but is considered poor style

Re:Some notes on Rust by theseoafs on Sunday February 01, 2015 @01:49PM (#8981114)
Right -- explicit returns are frowned upon in the last line of a function, because they're absolutely not necessary, but everywhere else they're kosher.
Re:Some notes on Rust by burntsushi on Sunday February 01, 2015 @01:52PM (#8981130)
Yes. Which is what I said. "Using a `return` as the last line of a function works" is not the same as "don't use explicit returns."
Re:Some notes on Rust by falcolas on Sunday February 01, 2015 @02:25PM (#8981273)
So I should use `return` except when I shouldn't? This is the cognitive overhead problem I'm talking about.

The original context of my concern is the instance where the match statement makes up the last statement in the function (frequently the only statement in the function's immediate scope). Since the individual cases are not terminating the function early, to get a value out of a match statement you simply leave the last expression bare.

i.e.

    fn something... {
      match input {
      Ok(input_val) => {/* several lines of semicolon terminated code*/
                        output}
      Err(errval) => {/* several more lines of semicolon terminated code */
              output}
    } 
is correct, but

    fn something... {
      match input {
      Ok(input_val) => {/* several lines of semicolon terminated code*/
                        return output;}
      Err(errval) => {/* several more lines of semicolon terminated code */
              return output;}
    } 
is poor style, and

    fn something... {
      match input {
      Ok(input_val) => {/* several lines of semicolon terminated code*/
                        output;}
      Err(errval => {/* several more lines of semicolon terminated code */
              output;}
    } 
is an error.
Re:Some notes on Rust by burntsushi on Sunday February 01, 2015 @02:36PM (#8981311)
> So I should use `return` except when I shouldn't? This is the cognitive overhead problem I'm talking about.

No. Use `return` only when you must. If you want an early return in a function, then you need to use `return`. If you don't need an early return, then don't use `return` at all.

I can't remember if this was ever a cognitive load for me personally. I don't think it was.

Re:Some notes on Rust by falcolas on Sunday February 01, 2015 @03:31PM (#8981539)
> I can't remember if this was ever a cognitive load for me personally. I don't think it was.

Well, to be fair, it sounds like you're used to semicolons having special meaning (aside from separating expressions) from a previous language.

> As for `;`, it's just like Standard ML. `;` is for sequencing expressions. I love it.

It's worth remembering that most users of C, C++, Ruby, Java, Python, or whathaveyou are not used to the semicolon having special meaning. Since Rust appears to be primarily aimed at replacing C++, this is going to be a significant change which will likely trip people up for awhile.

Re:Some notes on Rust by agrover on Monday February 02, 2015 @01:29AM (#8982973)
I'm a C/Python person, and it did take a question on irc for me to get my head around how Rust does it, but now it seems so natural that it's a little irksome to look at some of my Python code :)
Re:Some notes on Rust by steveklabnik on Monday February 02, 2015 @02:21AM (#8983081)
Ruby also does this, so if you want that natural feel in your dynamically typed language... ;)
Re:Some notes on Rust by pcwalton on Sunday February 01, 2015 @10:58PM (#8982661)
> This is the cognitive overhead problem I'm talking about.

The cognitive overhead of having the value of a function be the last expression in it is incredibly minor; lots of languages have this feature. Even JavaScript and C# have this with their arrow functions.

> …is an error.

The only time you get an error is if you tried to do something that you couldn't do in C++ at all (returning a value without typing return). I don't see how that would confuse C++ programmers. C++ programmers who write Rust using explicit returns everywhere will have their programs work exactly as they expect.

Re:Some notes on Rust by Gurkenmaster on Monday February 02, 2015 @08:04AM (#8983947)
>The cognitive overhead of having the value of a function be the last expression in it is incredibly minor; lots of languages have this feature.

This can cause performance problems in Coffescript because for loops are also expressions.