Comments (4)
I think it shouldn't be implicit, just as on async
functions you need to use await
to wait other asynchronous actions.
from js-proposal-algebraic-effects.
In my opinion you have to use @@
. Using async/await
would break what is written is Dan's post.
The idea to use @@
is because (type-wisely speaking) you are returning two different types and it can break inference (even more!).
For example, say initially getName :: Void -> String
, when you have a name = perform
, you don't have a String
anymore, you probably have a Effect<String>
, (Effect<a>
, where a
is any possible types of an effect), and therefore getName is not Void -> String
. It could be that getName
was a Res<String>
, where Res would either be String
or a Effect<String>
, or simplifying it: Either<String, Effect<String>>
. I am using a mix of Haskell and F# in the notation xD
Would suggest to take a look at Railroad Oriented Programming (to get some inspiration)
from js-proposal-algebraic-effects.
What if this spec was simply an extension for generators. And instead of perform
we just use yield
, but we add handle
to try
.
Then all generator functions can have effects injected. All the monadic semantics are already there.
Arguably async/await was just a specialization of a generator based coroutine, and that was largely required because promises weren't 100% monadic. But we can learn from that mistake and reuse the existing constructs.
I still think the new try / handle
should be added, but as an extension of the existing generator spec.
If we did that, we wouldn't need @@
right?
from js-proposal-algebraic-effects.
@JAForbes I think that using generators to handle the effect will take out this proposal's major advantage: no function color.
Using generators, we need to add *
at the beginning of the function and it returns only iterator values, and so it'll color our functions.
Also, updating the generator behavior to not need *
neither always return iterator looks like a big change that I would prefer to avoid.
from js-proposal-algebraic-effects.
Related Issues (13)
- Nested effects HOT 2
- Async handlers
- What should happen if we perform an effect and there is no handle to catch it? HOT 42
- Statement "resume" really should be restrict to "effect" block? HOT 3
- When we could use perform expression? HOT 1
- How will the effect interact with the ecosystem of TypeScript? HOT 8
- Alternative Syntax HOT 7
- Replace Portuguese comments
- Add "effect" as a parameter in handle block HOT 2
- Testing HOT 1
- Passing parameters to effects HOT 1
- make failed
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from js-proposal-algebraic-effects.