Sun May 2 17:35:23 EDT 2010
This is about _interface_. It's the same DAG, but we want to use it
in different ways:
1. Function: give it some inputs, let it produce output.
2. Structural: connect functionality to storage nodes (i.e. for the
implementation of combinators).
Basicly, I want to be able to ping-pong between those.
The function view is needed to integrate in a general Haskell
functional world, while the structural view is needed to express
dataflow combinators and integration into an imperative world with
explicit data allocation.
SSA conversion and memoization can probably be completely delegated to
the _implementation_ side. The important part is the abstract part:
what do these 2 interfaces mean?
Looks like I'm at the point of reinventing the Arrow abstraction,
where 1. is the function type constructor (->) and 2. is an arrow type