Well, the point of keeping track of side-effects is that you keep track of them... It's the "leaf functions" (functions that doesn't depend on other functions) that should be funcs, and then the rest of the functions can be funcs or procs depending on **what they actually are**. For example the main function should be a proc but it can use funcs. Having everything be a func defeats the point of using them at all IMHO. But sure, if there is some silly case you can use it, but as I said, using func for absolutely everything defeats the point of using it in the first place if you only have to "cheat" the system all the time.
Nice solution you found though! Seems solid :D