haskell 入門

うーん、やっぱり haskell はまだ全く勉強不足。コンパイルを通すだけできつい。incremental に何か作れる気がまるでしないな。最初から定義を書き下せるくらいでないと。
以下、全く自信のない secd machine in haskell の途中。GHC 6.6 環境。

*Main> secd ([], [], [LDC 2, LDC 3, SUB, LDC 7, ADD], [])
([NUMBER 8],[],[],[])
data Inst = NIL
          | LDC Integer
          | NUMBER Integer
          | ADD
          | SUB
          | MUL
          | EQL
          | SEL
          | JOIN
          | BOOLEAN Bool
          | CONS
          | Insts [Inst]
          | LDF [Inst]
          | CLS [Inst] [Inst]
          | AP
            deriving (Eq, Show)

secd :: ([Inst], [Inst], [Inst], [Inst]) -> ([Inst], [Inst], [Inst], [Inst])

secd (s, e, NIL:cs, d) = secd (NIL:s, e, cs, d)
secd (s, e, (LDC n):cs, d) = secd ((NUMBER n):s, e, cs, d)
secd (NUMBER a:NUMBER b:s, e, ADD:c, d) = secd (NUMBER (a + b):s, e, c, d)
secd (NUMBER a:NUMBER b:s, e, SUB:c, d) = secd (NUMBER (a - b):s, e, c, d)
secd (NUMBER a:NUMBER b:s, e, MUL:c, d) = secd (NUMBER (a * b):s, e, c, d)
secd (NUMBER a:NUMBER b:s, e, EQL:c, d) = secd (BOOLEAN(a == b):s, e, c, d)

secd (BOOLEAN x:s, e, SEL:Insts ct:Insts cf:c, d) = if x
                                                    then secd (s, e, ct, Insts c:d)
                                                    else secd (s, e, cf, Insts c:d)
secd (s, e, JOIN:c, (Insts cr):d) = secd (s, e, cr, d)

secd (s, e, c, d) = (s, e, c, d)