Skip to content

Instantly share code, notes, and snippets.

@jiamo
Created January 30, 2021 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jiamo/78cebce344020bbb4ddda73743f90715 to your computer and use it in GitHub Desktop.
Save jiamo/78cebce344020bbb4ddda73743f90715 to your computer and use it in GitHub Desktop.
Try to make a same type definition for mutually eval add expr
module SimpleEval where
import Prelude hiding (odd, even)
import Data.Dynamic
data Expr = Val Int | Add Expr Expr
data Cont = HALT | EVAL Expr Cont | ADD Int Cont
eval :: Expr -> Int
eval e = comp_eval e HALT
comp_eval :: Expr -> Cont -> Int
comp_eval (Val n) c = exec c n
comp_eval (Add x y) c = comp_eval x (EVAL y c)
exec :: Cont -> Int -> Int
exec HALT n = n
exec (ADD n c) m = exec c (n+m)
exec (EVAL y c) n = comp_eval y (ADD n c)
eval2 :: Expr -> Int
eval2 e = comp_eval2 e HALT 0
comp_eval2 :: Expr -> Cont -> Int -> Int
comp_eval2 (Val n) c m = exec2 (Val (n+m)) c n
comp_eval2 (Add x y) c m = comp_eval2 x (EVAL y c) m
exec2 :: Expr -> Cont -> Int -> Int
exec2 (Val f) HALT n = n
exec2 (Val f) (ADD n c) m = exec2 (Val (f+m+n)) c (n+m)
exec2 (Val f) (EVAL y c) n = comp_eval2 y (ADD n c) (f)
-- eval (Add (Add (Val 2) (Val 3)) (Val 4))
-- = comp_eval (Add (Add (Val 2) (Val 3)) (Val 4)) HALT
-- = comp_eval (Add (Val 2) (Val 3)) (EVAL (Val 4) HALT)
-- = comp_eval (Val 2) (EVAL (Val 3) (EVAL (Val 4) HALT))
-- = exec (EVAL (Val 3) (EVAL (Val 4) HALT)) 2
-- = comp_eval (Val 3) (ADD 2 (EVAL (Val 4) HALT))
-- = exec (ADD 2 (EVAL (Val 4) HALT)) 3
-- = exec (EVAL (Val 4) HALT ) 5
-- = comp_eval (Val 4) (ADD 5 HALT )
-- = exec (ADD 5 HALT ) 4
-- = exec HALT 9 =9
-- eval (Add (Add (Val 2) (Val 3)) (Val 4))
-- = comp_eval (Add (Add (Val 2) (Val 3)) (Val 4)) HALT 0
-- = comp_eval (Add (Val 2) (Val 3)) (EVAL (Val 4) HALT 0) 0
-- = comp_eval (Val 2) (EVAL (Val 3) (EVAL (Val 4) HALT 0) 0) 0
-- = exec (Val 2) (EVAL (Val 3) (EVAL (Val 4) HALT 0) 0)
-- = comp_eval (Val 3) (ADD 2 (EVAL (Val 4) HALT 0) 0) 2
-- = exec (Val 5) (ADD 2 (EVAL (Val 4) HALT 0)) 3
-- = exec (Val 9) (EVAL (Val 4) HALT 0) 5
-- = comp_eval (Val 4) (ADD 5 HALT ) 9
-- = exec (Val 9) (ADD 5 HALT ) 4
-- = exec (Val 9) HALT 9 =9
comp_eval3 :: Expr -> Cont -> Int
comp_eval3 (Val n) c = exec3 (Val n) c
comp_eval3 (Add x y) c = comp_eval3 x (EVAL y c)
exec3 :: Expr -> Cont -> Int
exec3 (Val f) HALT = f
exec3 (Val f) (ADD n c) = exec3 (Val (f+n)) c
exec3 (Val f) (EVAL y c) = comp_eval3 y (ADD f c)
primes :: [Integer]
primes = sieve [2..]
where sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p > 0]
even :: Int -> Bool
even 0 = True
even n = odd (n - 1)
odd :: Int -> Bool
odd 0 = False
odd n = even (n - 1)
fact self 0 = 1
fact self n = n * self (pred n)
fix2 f =
let wrap = toDyn
unwrap x = fromDyn x undefined
aux g = g (wrap g)
in aux (\x -> f (unwrap x x))
test2 = fix2 fact (5::Int)
fix_poly:: [[a]->a] -> [a]
fix_poly fl = fix (\self -> map ($ self) fl)
where fix f = f (fix f)
test1 = (map iseven [0..5], map isodd [0..5])
where
[iseven, isodd] = fix_poly [fe,fo]
fe [e,o] n = n == 0 || o (n-1)
fo [e,o] n = n /= 0 && e (n-1)
-- eval (Add (Add (Val 2) (Val 3)) (Val 4))
-- = eval (Add (Val 2) (Val 3)) + eval (Val 4)
-- = eval ((Val 2) + eval (Val 3) ) + eval (Val 4)
-- = ( 2 + eval (Val 3) ) + eval (Val 4)
-- = ( 2 + 3 ) + eval (Val 4)
-- = 5 + eval (Val 4)
-- = 5 + 4
-- = 9
-- eval' (Add x y) c = eval' x (EVAL y c)
-- exec (EVAL y c) n = eval' y (ADD n c)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment