Re:The problem of effects in Rust (2020)
by sullyj3 on Saturday August 28, 2021 @12:56AM
(#28335744)
I mean, monads famously don't compose - you have to write a bunch of monad transformers.
Re:The problem of effects in Rust (2020)
by sfvisser on Saturday August 28, 2021 @03:01AM
(#28336177)
True, but not a huge real world issue in nearly all the relevant cases.
I can very easily have a fallible, asynchronous, multi-value, stateful, database connected computation that returns a Bool and use it in let’s say ‘filterM’.
Most transformers are already written for me.
Edit: switching between no effect and some effect is the tricky part though.
Re:The problem of effects in Rust (2020)
by sullyj3 on Saturday August 28, 2021 @08:06AM
(#28337416)
I find in practice that even though I don't have to write the transformers myself, `lift`ing and `unlift`ing things is a pain in the ass. Once you try a proper algebraic effect system, it's hard to feel like transformers are an adequate solution.
Re:The problem of effects in Rust (2020)
by thinkharderdev on Saturday August 28, 2021 @06:57AM
(#28337125)
Most of the relevant plumbing is generic though. Check out ZIO or cats-effect in Scala which I think both provide highly composable effect systems.
Re:The problem of effects in Rust (2020)
by rrradical on Friday August 27, 2021 @11:29PM
(#28335392)
Well, more attempts at this problem come along pretty often (speaking for Haskell at least, and I expect those attempts to be more mature than the other languages you mentioned), so I don't think you can say those languages have solved it. Like the other comment mentioned, it's an active area of research, and some of the research happens in languages designed to solve that problem, and some happens in languages that support solutions to the problem.
(Just to add- there's a really wide range of ergonomics that you can support and it's hard to get everything right. And performance is super tricky!)
That being said, Rust has a bit of a harder time due to the focus on performance and optimally zero-cost abstraction, whereas other languages are more lenient and focus rather on expressiveness and composability / code reuse.