If we were to create a Rust version of this page for Haskell, what cool programming techniques would you add to it?
Can’t think of anything.
The novelty must have worn off over time.
Or maybe my mind doesn’t get blown easily.Not exactly the same thing but this is still pretty funny. This is code that is technically 100% legal Rust but you should definitely never write such code 😅.
What madness caused this
It’s a test for the compiler which ensures that these legal yet extremely weird expressions continue to compile as the compiler is updated. So there is a purpose to the madness but it does still look pretty funny.
A cool thing you can do, is to store values of all kinds of types in a big HashMap, basically by storing their
TypeId
and casting them toBox<dyn Any>
(see std::any).
Then you can later retrieve those values by specifying the type (and optionally another ID for storing multiple values of the same type).So, you can create an API which is used like this:
let value = MyType::new(); storage.insert(value); let retrieved = storage.get::<MyType>(); assert_eq!(retrieved, value);
There’s various ECS storage libraries which also implement such an API. Depending on what you’re doing, you might prefer to use those rather than implementing it yourself, but it’s not too difficult to implement yourself.
There’s a crate for it too: anymap2
What if I specify the wrong type?
let retrieved = storage.get::<SomeOtherType>();
?Is it a runtime error or a compile time error?
To answer my own question: I believe it’s a runtime error: https://doc.rust-lang.org/stable/std/any/trait.Any.html#method.downcast
Well, you would determine the
TypeId
ofSomeOtherType
, then search for that as the key in your HashMap and get back aNone
, because no entry exists and then you’d hand that back to the user.
I guess, my little usage example should’ve included handling of anOption
value…So, it’s only a runtime error, if you decide to
.unwrap()
or similar.
Rust isn’t really a language that lends itself to terse point-free functional idioms… The sort of examples I might want to share would probably require a bit more context, certainly more code. Like I think type guards and arena allocation are cool and useful tricks but I don’t think I could write a neat little example showing or motivating either
Yeah I don’t mean just terse functional idioms. Any programming technique that blew your mind the first time you came across it would qualify.
Type guards, then :) very cool, much compiler power, love it
Do you mean RAII guards
https://rust-unofficial.github.io/patterns/patterns/behavioural/RAII.html
Or match guards?
https://doc.rust-lang.org/rust-by-example/flow_control/match/guard.html
Maybe they’re referring to “where clauses”?
The haskell examples look more like an arcane wizardry.
My favorite example of haskell arcane wizardry is löb. It’s mentioned in this list but not really done justice imo.
😂 Ikr!
I’d like to see a Rust solution to Tony Morris’s tic tac toe challenge:
https://blog.tmorris.net/posts/scala-exercise-with-types-and-abstraction/index.html
His rant about it is here:
I did a Haskell GADT solution some time back and it’s supposed to be doable in Java and in C++. Probably Rust too. I wonder about Ada.
This could be done almost trivially using the typestate pattern: https://zerotomastery.io/blog/rust-typestate-patterns/.