Created
April 8, 2012 14:30
-
-
Save ranha/2337591 to your computer and use it in GitHub Desktop.
hoge
This file contains hidden or 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
{-# LANGUAGE ScopedTypeVariables #-} | |
{-# LANGUAGE RankNTypes #-} | |
{-# LANGUAGE GADTs #-} | |
{-# LANGUAGE KindSignatures #-} | |
data Hask :: * -> * where | |
App :: Hask (a -> b) -> Hask a -> Hask b | |
Abs :: (Hask a -> Hask b) -> Hask (a -> b) | |
ValB :: Bool -> Hask Bool | |
ValS :: String -> Hask String | |
Loop :: Hask a -> Hask a | |
Par :: Hask a -> Hask a -> Hask a | |
app :: Hask (a -> b) -> Hask a -> Hask b | |
app (Abs x) y = x y | |
app (App x y) z = App (app x y) z | |
step :: Hask a -> Hask a | |
step (App f a) = app f a | |
step (Abs f) = Abs f | |
step (ValB b) = ValB b | |
step (ValS s) = ValS s | |
step (Loop x) = Loop x | |
step (Par (ValB a) b) = ValB a | |
step (Par a (ValB b)) = ValB b | |
step (Par a b) = Par (step a) (step b) | |
sem :: Hask a -> Hask a | |
sem (App f a) = sem (app f a) | |
sem (Abs f) = (Abs f) | |
sem (ValB b) = (ValB b) | |
sem (ValS s) = (ValS s) | |
sem (Loop x) = sem (Loop x) | |
sem (Par a b) = sem (step (Par a b)) | |
mshow (Loop _) = ValS "loop" | |
mshow (App _ _) = ValS "App" | |
mshow (ValB x) = ValS $ show x | |
instance Show (Hask a) where | |
show (ValS s) = s | |
show (ValB b) = show b | |
mor :: Hask Bool -> Hask Bool -> Hask Bool | |
mor x@(Loop _) z = App (App (Abs (\x -> (Abs (\y -> mor x y)))) x) z | |
mor (App x y) z = App (App (Abs (\x -> (Abs (\y -> mor x y)))) (app x y)) z | |
mor (ValB True) _ = ValB True | |
mor (ValB False) x = x | |
por :: Hask Bool -> Hask Bool -> Hask Bool | |
por x y = sem (Par (mor x y) (mor y x)) | |
myid = Abs (\x -> x) | |
loop = Loop loop | |
b1 = ValB True | |
b2 = App myid b1 | |
b3 = App myid b2 | |
v1 = por loop b3 | |
v2 = por b3 loop |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment