Haskellコア構文

出典: どう書くwiki

Haskell Hackathon 2008

[編集] コア構文

GHCは、糖衣構文をぜんぶ取り払うことで、Haskellのソースをmainだけにし、 そのmainをHaskell上でExpr型のインスタンスとして表現する、という処理をしているようです。

これはHaskellに基づいた表現法ですが どんな言語によるHaskellの実装であっても、 わりと膨大なHaskellの構文規則のうち、最低限これと等価なものさえ実装すれば何でも動かすことが可能です。

Expr型は

data Expr b
    = Var Id                        -- 変数           x
    | Lit Literal                   -- リテラル       1  1.0  'a'  "abc"
    | App (Expr b) (Arg b)          -- 関数適用       f a
    | Lam b (Expr b)                -- 無名関数       \x -> ...
    | Let (Bind b) (Expr b)         -- 局所定義       let x = .. in ..
    | Case (Expr b) b Type [Alt b]  -- パターンマッチ case x of ..
    | Note Note (Expr b)            -- 注釈付きの式   ??
    | Type Type                     -- 型             ??

bはバインダといって、シンボル名に対してそれが束縛されるべき値を覚えておく仕組みです。

たとえば単純に[(String,Expr)]なバインダを使うとしたら

a = 6
b = 7
main = print $ a*b

main::Expr [(String,Expr)]
main = Let (
   Bind [("a",Lit 6) , ("b",Lit 7)]
)
(App 
   (Var "print") 
   (App (App (*) (Var "a")) (Var "b")))

のように変換できればよい。

どう書く?org