海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
この間はじめた、Modern Compiler Implementation in Haskell という遊びは、 けっこう面白くて良いです。きちんと読みたかった Tiger Book も読めて、Haskell を書く量を確保する意味でもいい感じ。
いま、5 章の Type Checking のところをやっているんですが、 どうも再帰的な型定義のところがあやしい。
testcases にある test5.tig は以下のようなコードなのですが、
/* define valid recursive types */ let /* define a list */ type intlist = {hd: int, tl: intlist} /* define a tree */ type tree ={key: int, children: treelist} type treelist = {hd: tree, tl: treelist} var lis:intlist := intlist { hd=0, tl= nil } in lis end
これを、今日書きたての type checker にかけると、こんな感じ:
$ ./driver.exe < ../testcases/test5.tig ExpTy {ty = RECORD [("hd",INT),("tl",NAME "intlist" (Just (RECORD [("hd",INT),("tl",NAME "intlist" Nothing)] 40016)))] 40016}
レコード型のフィールド部分に Nothing が残っちゃっています。
最初は tl=nil のところで型チェックでコケていました:
$ ./driver.exe < ../testcases/test5.tig driver.exe: Pos {line = 10, column = 36}undefined type (1): intlist
そこで、苦し紛れに trdec (A.TypeDec tdecs) を 3 pass にしてみたけど、やっぱりダメよねと。
明日、ちゃんと考えよう。
以下のコードも参考にさせてもらおうかな: https://github.com/steshaw/tiger-ml
せっかく無理やり実装した unique を使ってないところも気になる。