【東方】「みこみこ魔理沙」イラスト/相生青唯 [pixiv]
abstract:利用Finally Tagless,我们可以把HOAS的变种编译上SKI Combinator,同时保留type safety还有extensibility。
前置知识:HOAS
如果你要写Lambda calculus解释器,你一定会遇到一个问题:如何表示一个binding?
最简单的办法(用string表示variable,substitution就是对所有相等String进行替换)有很大的局限性:
data Expr = Var String | Abs String Expr | App Expr Expr deriving (Show, Eq) eval :: Expr -> Expr eval (Var n) = Var n eval (Abs n x) = Abs n (eval x) eval (App l@(Var _) r) = App l (eval r) eval (App l@(App _ _) r) = eval (App (eval l) (eval r)) eval (App (Abs n l) r) = eval (subst l) where subst (Var n') | n == n' = r subst (Var n') | n /= n' = Var n' subst (Abs n' x) | n == n' = Abs n' x subst (Abs n' x) | n /= n' = Abs n' (subst x) subst (App ll lr) = App (subst ll) (subst lr) term = Abs "y" (App (Abs "x" (Abs "y" (Var "x"))) (Var "y")) main = putStr $ show $ eval term 在(\y (\x \y x) y)下做替换,就会成为(\y y),改变了语义。...