Guest User

Untitled

a guest
Jul 19th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1.  
  2. {-# LANGUAGE PackageImports #-}
  3. {-# LANGUAGE GADTs, StandaloneDeriving#-}
  4.  
  5. import Control.Applicative
  6. import Control.Arrow
  7. import Control.Monad.Identity
  8. import Data.Typeable
  9.  
  10. type PlayerNumber = Int
  11. type RuleNumber = Int
  12. type Game = Int
  13. type Comm = Int
  14. type Action = Int
  15. type Actions = [Action]
  16.  
  17. data EvaluatorT m a = EvaluatorT (Game -> m (Game, Either Actions a))
  18.  
  19. type EvaluatorIO a = EvaluatorT IO a
  20. type Evaluator a = EvaluatorT Identity a
  21.  
  22. runEvaluator (EvaluatorT f) game = f game
  23.  
  24. execEvaluator e g = fmap fst $ runEvaluator e g
  25. evalEvaluator e g = fmap snd $ runEvaluator e g
  26.  
  27. instance Functor m => Functor (EvaluatorT m) where
  28. f `fmap` e = EvaluatorT $ fmap (second $ right f) . runEvaluator e
  29.  
  30. -- Applicative instances with different semantics in Game-State handling
  31. -- on Left values
  32.  
  33. -- instance (Monad m, Applicative m) => Applicative (EvaluatorT m) where
  34. -- pure a = EvaluatorT $ \g -> pure (g, Right a)
  35. -- ef <*> ev = EvaluatorT $ \g -> do
  36. -- (g', resf) <- runEvaluator ef g
  37. -- (g'', resv) <- runEvaluator ev g'
  38. -- return $ case (resf, resv) of
  39. -- (Left a1, Left a2) -> (g, Left (a1 ++ a2))
  40. -- (Left a , _ ) -> (g, Left a)
  41. -- (_ , Left a ) -> (g, Left a)
  42. -- (Right f, Right v) -> (g'', Right $ f v)
  43.  
  44. instance (Monad m, Applicative m) => Applicative (EvaluatorT m) where
  45. pure a = EvaluatorT $ \g -> pure (g, Right a)
  46. ef <*> ev = EvaluatorT $ \g -> do
  47. (g', resf) <- runEvaluator ef g
  48. case resf of
  49. Left a1 -> do resv <- evalEvaluator ev g
  50. return $ case resv of
  51. Left a2 -> (g, Left (a1 ++ a2))
  52. Right _ -> (g, Left a1)
  53. Right f -> do (g'', resv) <- runEvaluator ev g'
  54. return $ case resv of
  55. Left a -> (g, Left a)
  56. Right v -> (g'', Right $ f v)
  57.  
  58. instance (Monad m) => Monad (EvaluatorT m) where
  59. return a = EvaluatorT $ \g -> return (g, Right a)
  60. ma >>= f = EvaluatorT $ \g -> do
  61. (g', resa) <- runEvaluator ma g
  62. case resa of
  63. Right a -> runEvaluator (f a) g'
  64. Left acts -> return (g', Left acts)
  65.  
  66. data Obs a where
  67. ProposedBy :: Obs PlayerNumber
  68. RuleNumber :: Obs RuleNumber
  69. SelfNumber :: Obs RuleNumber
  70. Official :: Obs Bool
  71. AllPlayers :: Obs [PlayerNumber]
  72. Equ :: (Eq a, Show a, Typeable a) => Obs a -> Obs a -> Obs Bool
  73. Plus :: (Num a) => Obs a -> Obs a -> Obs a
  74. Time :: (Num a) => Obs a -> Obs a -> Obs a
  75. Minus :: (Num a) => Obs a -> Obs a -> Obs a
  76. And :: Obs Bool -> Obs Bool -> Obs Bool
  77. Or :: Obs Bool -> Obs Bool -> Obs Bool
  78. Not :: Obs Bool -> Obs Bool
  79. If :: Obs Bool -> Obs a -> Obs a -> Obs a
  80. Konst :: a -> Obs a
  81. Map :: (Obs a -> Obs b) -> Obs [a] -> Obs [b]
  82. Foldr :: (Obs a -> Obs b -> Obs b) -> Obs b -> Obs [a] -> Obs b
  83. Vote :: Obs String -> Obs Int -> Obs Bool
  84.  
  85. evalOp2 o a b = o <$> eval a <*> eval b
  86.  
  87. eval :: (Monad m,Applicative m) => Obs a -> EvaluatorT m a
  88. eval (Konst a) = return a
  89. eval (Equ a b) = evalOp2 (==) a b
  90. eval (Plus a b) = evalOp2 (+) a b
  91. eval (Time a b) = evalOp2 (*) a b
  92. eval (Minus a b) = evalOp2 (-) a b
  93. eval (And a b) = evalOp2 (&&) a b
  94. eval (Or a b) = evalOp2 (||) a b
  95. eval (Not a) = not <$> eval a
  96. eval (If ot oa ob) = do t <- eval ot; eval $ if t then oa else ob
  97. eval (Map f lst) = join (evalSequence <$> map (eval.f.Konst) <$> eval lst)
  98. eval (Foldr f init lst) = join (eval <$> foldr (f.Konst) init <$> eval lst)
  99.  
  100. -- evalSequence with different semantics using either monadic instance of the
  101. -- applicative one
  102. evalSequence :: (Applicative m, Monad m) => [EvaluatorT m a] -> EvaluatorT m [a]
  103. -- evalSequence = sequence -- this one uses the monadic interface
  104. evalSequence [] = pure [] -- and this one uses the applicative one
  105. evalSequence (x:xs) = (:) <$> x <*> evalSequence xs
Add Comment
Please, Sign In to add comment