Very nice explanation.
> we could design languages which combine the easiness of reasoning featured by purely functional programming, while still offering good support for event-based programming (eg, for GUIs).
Are there any particular difficulties (or niceties!) when these are combined?
For example, does this cause implementation details to leak, like requiring the programmer to choose between multiple definitions of things like function types: "a -> b", "a -> eventually b", "eventually a -> b", "eventually a -> eventually b", "a eventually-> b", "a eventually-> eventually b", ....?
Does it make reasoning easier or harder, e.g. regarding resource usage (space leaks, lazy IO, etc.)? How does it compare to lazy evaluation?
If someone uses events internally to a library, e.g. to read from some stream, could they encapsulate that such that users of their API wouldn't have to notice/care about the events? I'm picturing something like exceptions, or lazily-evaluated IO values, which can trigger errors inside seemingly pure code, e.g. like in Haskell where the `readFile` call in `do { content <- readFile "foo.txt"; return (toUpperCase content); }` might work fine, but then an IO error is triggered inside the pure `toUppercase` function. Would such things cause reasoning problems about futures?