sdiehl / write-you-a-haskell

Building a modern functional compiler from first principles. (http://dev.stephendiehl.com/fun/)
MIT License
3.34k stars 256 forks source link

SKK /= I in chapter 4 #88

Open reuleaux opened 8 years ago

reuleaux commented 8 years ago

I am working through your wonderful "Write you a Haskell" tutorial, thanks a lot for creating it in the first place.

I have downloaded and compiled the code for chapter 4 (the untyped lambda calculus).

Contrary to the explanations in the text, SKK does not reduce to I in my case, instead I get:

Untyped> (\x y z. x z (y z)) (\x y . x) (\x y . x)
  => \x y z . (x z (y z))
  => \x y . x
 => \x y z . (x z (y z)) (\x y . x)
 => \x y . x
<<closure>>
Untyped>

Recall, that according to the text on page 50 I should see something along the lines of:

Untyped> (\x y z. x z (y z)) (\x y . x) (\x y . x)
  => \x y z . (x z (y z))
  => \y z . ((\x y . x) z (y z))
    => \x y . x
    => \y . z
   => z
 => \z . z
\z . z

I wonder what's going on? Cannot be a huge thing, as the data structures / code base is relatively small at this point.

Nevertheless, as SKK=I is supposed to be a kind of litmus test, I would like to get this fixed.

A few more explanations for what's going on in detail in Eval.hs would also be nice (VClosure, Scope, type Eval = WriterT [Step](State EvalState) a, inc, red, etc)

Thanks.

sdiehl commented 7 years ago

In this case you get a closure whose value is an identity function (\x -> x).

reuleaux commented 7 years ago

OK, thanks.

Stephen Diehl notifications@github.com writes:

In this case you get a closure whose value is an identity function (\x -> x).