
Neil Mitchell wrote:
sum (enum 1 10) => sum' 0 (enum 1 10) => ...
sum' 36 (9 : enum (9+1) 10) => (sum' $! (36+9)) (enum (9+1) 10) => sum' 45 (enum (9+1) 10) => sum' 45 [] => 45
(I need to find some way to automate making these trails :) ) Yes! We'd need such an automatic tool for the wikibook, too.
The problem is that Haskell is ridiculously complex, and the "small step" interpretation is much harder than you'd think. For example, sum may well be defined as foldl' (+) 0, which is a CAF, so gets reduced once. The 0 won't actually be a 0, but will be fromInteger 0, which will correspond to looking up an item in the dictionary and applying it. Dictionaries especially make the "simple" interpretation completely wrong.
It's easy to do informally, but once you start being more precise, its very complex.
Yeah, the precise details may vary, even :) But for teaching, an automatic tool that does graph reduction would be great. I don't mind if it's sloppy (directly apply definitions & pattern matching VS everything is a lambda abstraction) and only does simply typed lambda calculus (no type applications, no type classes). Regards, apfelmus