Created
January 30, 2021 13:39
-
-
Save jiamo/78cebce344020bbb4ddda73743f90715 to your computer and use it in GitHub Desktop.
Try to make a same type definition for mutually eval add expr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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