Guest User

Untitled

a guest
Oct 18th, 2018
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. {-# LANGUAGE FlexibleInstances #-}
  2. {-# LANGUAGE FunctionalDependencies #-}
  3. {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  4. {-# LANGUAGE InstanceSigs #-}
  5. {-# LANGUAGE MultiParamTypeClasses #-}
  6. {-# LANGUAGE StandaloneDeriving #-}
  7. module Set where
  8.  
  9. import Data.List (nub, elem)
  10.  
  11. newtype Set a = Set { elems_s :: [a] } deriving (Show, Eq)
  12.  
  13. class IsSet elem set | set -> elem where
  14. fromList :: [elem] -> set
  15. empty :: set
  16. singleton :: elem -> set
  17.  
  18. size :: set -> Int
  19. contains :: set -> elem -> Bool
  20.  
  21. add :: set -> elem -> set
  22. union :: set -> set -> set
  23. intersect :: set -> set -> set
  24.  
  25. smap :: (elem -> elem) -> set -> set
  26.  
  27. instance Eq a => IsSet a (Set a) where
  28. fromList :: [a] -> Set a
  29. fromList = Set . nub
  30.  
  31. empty :: Set a
  32. empty = Set []
  33.  
  34. singleton :: a -> Set a
  35. singleton x = Set [x]
  36.  
  37. size :: Set a -> Int
  38. size (Set x) = length x
  39.  
  40. contains :: Set a -> a -> Bool
  41. contains (Set xs) y = y `elem` xs
  42.  
  43. add :: Set a -> a -> Set a
  44. add s x = if s `contains` x then Set (x : elems_s s) else s
  45.  
  46. union :: Set a -> Set a -> Set a
  47. union (Set xs) (Set ys) = fromList (xs ++ ys)
  48.  
  49. intersect :: Set a -> Set a -> Set a
  50. intersect xs ys = Set [ x | x <- elems_s xs, not (ys `contains` x) ]
  51.  
  52. smap :: (a -> a) -> Set a -> Set a
  53. smap = smap_s
  54.  
  55. smap_s :: (Eq b) => (a -> b) -> Set a -> Set b
  56. smap_s f (Set s) = fromList $ map f s
  57.  
  58. -------------------------------
  59.  
  60. newtype PureSet = PureSet { elems_p :: Set PureSet } deriving (Show, Eq)
  61.  
  62. deriving instance IsSet PureSet PureSet
  63.  
  64. -------------------------------
  65.  
  66. example1 :: Set (Set (Set Int))
  67. example1 = fromList [empty, fromList [empty]]
  68.  
  69. example2 :: PureSet
  70. example2 = fromList [empty, fromList [empty]]
Add Comment
Please, Sign In to add comment