Finger Tree

Finger Treeshttp://comonad.com/reader/wp-content/uploads/2010/04/Finger-Trees.pdf Finger Trees: A Simple General-purpose Data Structure 最近看了finger tree的一些blog,觉得挺有意思的 可以试下自己对comonad里面的typed 2-3 tree加入插入/del,有一定难度,不过polymorphic recursion就好。。。

September 12, 2016 · 圆角骑士魔理沙 · CC BY-SA 4.0

幻想中的Haskell - Compiling Combinator

【東方】「みこみこ魔理沙」イラスト/相生青唯 [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),改变了语义。...

September 5, 2016 · 圆角骑士魔理沙 · CC BY-SA 4.0