Guest User

Untitled

a guest
Sep 24th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. {-# LANGUAGE ScopedTypeVariables #-}
  2. {-# LANGUAGE RankNTypes #-}
  3. {-# LANGUAGE GADTs #-}
  4. {-# LANGUAGE KindSignatures #-}
  5.  
  6. data Hask :: * -> * where
  7. App :: Hask (a -> b) -> Hask a -> Hask b
  8. Abs :: (Hask a -> Hask b) -> Hask (a -> b)
  9. ValB :: Bool -> Hask Bool
  10. ValS :: String -> Hask String
  11. Loop :: Hask a -> Hask a
  12. Par :: Hask a -> Hask a -> Hask a
  13.  
  14. app :: Hask (a -> b) -> Hask a -> Hask b
  15. app (Abs x) y = x y
  16. app (App x y) z = App (app x y) z
  17.  
  18. step :: Hask a -> Hask a
  19. step (App f a) = app f a
  20. step (Abs f) = Abs f
  21. step (ValB b) = ValB b
  22. step (ValS s) = ValS s
  23. step (Loop x) = Loop x
  24. step (Par (ValB a) b) = ValB a
  25. step (Par a (ValB b)) = ValB b
  26. step (Par a b) = Par (step a) (step b)
  27.  
  28. sem :: Hask a -> Hask a
  29. sem (App f a) = sem (app f a)
  30. sem (Abs f) = (Abs f)
  31. sem (ValB b) = (ValB b)
  32. sem (ValS s) = (ValS s)
  33. sem (Loop x) = sem (Loop x)
  34. sem (Par a b) = sem (step (Par a b))
  35.  
  36. mshow (Loop _) = ValS "loop"
  37. mshow (App _ _) = ValS "App"
  38. mshow (ValB x) = ValS $ show x
  39.  
  40. instance Show (Hask a) where
  41. show (ValS s) = s
  42. show (ValB b) = show b
  43.  
  44. mor :: Hask Bool -> Hask Bool -> Hask Bool
  45. mor x@(Loop _) z = App (App (Abs (\x -> (Abs (\y -> mor x y)))) x) z
  46. mor (App x y) z = App (App (Abs (\x -> (Abs (\y -> mor x y)))) (app x y)) z
  47. mor (ValB True) _ = ValB True
  48. mor (ValB False) x = x
  49.  
  50. por :: Hask Bool -> Hask Bool -> Hask Bool
  51. por x y = sem (Par (mor x y) (mor y x))
  52.  
  53. myid = Abs (\x -> x)
  54. loop = Loop loop
  55. b1 = ValB True
  56. b2 = App myid b1
  57. b3 = App myid b2
  58.  
  59. v1 = por loop b3
  60. v2 = por b3 loop
Add Comment
Please, Sign In to add comment