I'd like to preface this by saying that I still really like the Elm Architecture and the experience of coding in Elm. With that said, however, there are three aspects of the architecture that have been bugging me.
1. Calling update and view on the whole application any time one thing changes
I realize that this is the pattern you get when you're using a virtual DOM implementation, but it screams "unnecessary calculation" to me. You can mitigate this somewhat with the "lazy" functions, but it still has to do a check to make sure nothing has changed, which wastes precious cycles. (I could be totally wrong about this.)
It would be nice to have a way to specify that a change is local to a particular component. Though this would also mean that local side effects are effectively hidden, which might go against the principles of the Elm Architecture.
2. Bubbling events all the way up and back down again
From what I understand, the way Signal.forwardTo works is it sends a Message to original Mailbox mapped over the provided function. Almost 100% of the time this is used just to wrap a child component's Action into its parent component's Action. This goes all the way up to the application root and then back down to where it's processed.
This is probably tied to #1, but it really seems extraneous. Again, I don't want to pay for architecture in cycles if I don't have to. My background is primarily in games, where cycles are of the utmost importance.
3. MOST IMPORTANTLY: Separation of Update and View/Effects as second-class citizens
It really hurts that the only accepted outputs of the Elm compiler are (Signal) Element and Html. The Elm Architecture can easily apply to more than just view code.
What if I want to make a web server in Elm? The "Actions" would be HTTP requests and the "view" would be HTTP responses.
What if I want to make a command-line utility in Elm? The "Actions" would be text and the "view" would be text.
What if I want to make a robot in Elm? The "Actions" would be sensor input and the "view" would be actions that the robot could take.
Currently, if I wanted to make any of these, I'd have to do so using ports (which is a lot better than having no options at all, but still suboptimal).
This ties directly into (what I believe to be) the unnecessary separation of the update and view functions. Html is output and so are Effects, so why not just have one function with type (Signal.Address Context -> Action -> Model -> (Model, Output))?
I fully realize that, in practice, if I was making UIs for the web, I would probably have my own view function, but that shouldn't be tied to the architecture itself.
Overall, I'd love to see Elm move forward, and I think addressing these three issues will be important in doing so. Unfortunately, I don't have solutions for issues 1 and 2, and my solution for issue 3 might very well be incorrect. I'd like to know what you all think.