4 ms·
Rust has first class functions and thus has higher order functions. Iterators have a bunch of higher order functions, map for example: let a = (0..10).map(|x|
by leshow 10y ago
Rust has first class functions and thus has higher order functions. Iterators have a bunch of higher order functions, map for example:
let a = (0..10).map(|x| x*x).collect::<Vec<_>>();
- wyager 10y agoI've already responded a couple times with the same content, but the short of it is that rust HOFs are very limited due to its memory model. True functional-style HOFs require arbitrarily sized closures on the heap, and the only way to get that in Rust is by boxing the closures, which ends up being relatively inconvenient. There's a reason no one uses HOFs in rust outside of trivially inlinable examples like the one you give. There are no composition or application operators in the standard library because it's just too syntactically inconvenient to work with HOFs in the same way you would in a functional language.
- leshow 10y agoIt's true it's not nearly as ergonomic as haskell to pass around functions. You don't necessarily need to box the closure up on the heap in order to store a bunch of functions in say a vector though, it just needs to sit behind some kind of &, &mut, Arc, Rc, Box, etc. I have seen a few hashmaps that store functions as values, in terms of real world uses. You mentioned storing functions (closures here) in a vector, this isn't too much of a stretch I don't think: let x = |c| c * 2; let y = |v| v + 2; let b: Vec<&Fn(_) -> _> = vec![&x, &y]; Definitely not "no higher order functions" as you claimed.
- wyager 10y agoBy the same token, C "supports" higher order functions; you can pass around a function pointer and a pointer to a closure. It's sort of an idiomatic question; HOFs are inconvenient enough in Rust that no one really uses them outside of a few specific cases (like local maps and folds).
- leshow 10y agoThere's a wide berth between inconvenient, which is subjective, and not supported. HOF's exist in Rust, could the ergonomics be better; that's up for debate.