3 ms·
Idiomatic Rust would look like this: fn double(x: i32) -> i32 { 2 * x } The reason Rust requires types here is because global inference is com
by steveklabnik 2y ago
Idiomatic Rust would look like this:
fn double(x: i32) -> i32 {
2 * x
}
The reason Rust requires types here is because global inference is computationally expensive and causes spooky action at a distance. The only real difference between your F# and this is the braces, which I do personally think makes code easier to read.
Of course there’s more overhead in smaller functions. I’d never write this code in Rust. I’d either inline it, or use a closure, which does allow for inference, and dropping the braces given that this is a one liner:
|x| 2 * x
Different needs for different things.
- itishappy 2y ago# Rust let double = |x| 2 * x; double(3); // F# let double = (*) 2 double 3 -- Haskell let double = (*2) double 3 # Python double = lambda x: 2 * x double(3)
- bmitc 2y agoIf I am understanding that |x| 2 * x in Rust is an anonymous function, another F# equivalent is fun x -> 2 * x.
- neonsunset 2y agoThe Haskell and F# examples above use partial application. This also works: let zeroCount = numbers |> Seq.filter ((=) 0) |> Seq.length
- steveklabnik 2y agoIt's a closure, not just an anonymous function, though it of course has an empty environment so it's not a significant difference in this case. Rust doesn't have syntax for anonymous functions, only closures.
- deleted 2y ago[deleted]
- bmitc 2y agoI thought that the Rust playground was requiring me to use return, but I was mistaken. However, it actually lends to my original point though because I would wager that dropping the return was part of the influence of ML on the beginnings of Rust.
- steveklabnik 2y agoExpression orientation certainly comes from that general space, for sure.