Guest User

Untitled

a guest
Jan 19th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. {-# LANGUAGE GADTs #-}
  2.  
  3. import Control.Applicative
  4. import Data.Dynamic
  5. import Data.Maybe
  6.  
  7. type Id = Integer
  8.  
  9. data Val where
  10. Var :: Id -> Val
  11. Val :: (Eq a, Typeable a, Show a) => a -> Val
  12.  
  13. instance Show Val where
  14. show (Var x) = "Var " ++ show x
  15. show (Val x) = show x
  16.  
  17. instance Eq Val where
  18. (Var x) == (Var y) = x == y
  19. (Val x) == (Val y) = fromMaybe False $ (==) x <$> cast y
  20. _ == _ = False
  21.  
  22. type Subst = [(Id, Val)]
  23.  
  24. val :: (Eq a, Typeable a, Show a) => a -> Val
  25. val = Val
  26.  
  27. var :: Id -> Val
  28. var = Var
  29.  
  30. gWalk :: Val -> Subst -> Val
  31. gWalk (Var x) s =
  32. case lookup x s of
  33. Just v -> gWalk v s
  34. otherwise -> var x
  35. gWalk v _ = v
  36.  
  37. ts :: Subst
  38. ts = [(4, var 2)
  39. ,(3, val True)
  40. ,(2, val "hello")
  41. ,(1, val $ Just "hi")]
  42.  
  43. gUnify :: Val -> Val -> Subst -> Maybe Subst
  44. gUnify v w s =
  45. case (gWalk v s, gWalk w s) of
  46. (v , w ) | v == w -> Just s
  47. (v@(Var x), w ) -> Just ((x,w):s)
  48. (v ,w@(Var x)) -> Just ((x,v):s)
  49. _ -> Nothing
  50.  
  51. tu = do let x = var 0
  52. s <- gUnify x (val "hello") []
  53. s' <- gUnify x (val True) s
  54. return s
Add Comment
Please, Sign In to add comment