Created
March 26, 2019 16:54
-
-
Save isovector/e4832512ec9c73bff94432a7a58470f9 to your computer and use it in GitHub Desktop.
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
| ==================== Tidy Core ==================== | |
| 2019-03-26 16:42:16.733069541 UTC | |
| Result size of Tidy Core | |
| = {terms: 572, types: 1,423, coercions: 358, joins: 0/6} | |
| -- RHS size: {terms: 5, types: 17, coercions: 9, joins: 0/0} | |
| $WUnion :: forall (e :: * -> *) a. e a -> Union '[e] a | |
| $WUnion | |
| = \ (@ (e :: * -> *)) (@ a) (dt :: e a) -> | |
| Union @ '[e] @ a @ e @~ <Co:9> dt | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| main2 :: Int | |
| main2 = I# 0# | |
| -- RHS size: {terms: 17, types: 78, coercions: 17, joins: 0/0} | |
| main3 | |
| :: forall x. | |
| Union '[State (Sum Int)] x -> Sum Int -> Identity (x, Sum Int) | |
| main3 | |
| = \ (@ x) (u :: Union '[State (Sum Int)] x) (eta :: Sum Int) -> | |
| case u of { Union @ e co a -> | |
| case a `cast` <Co:5> of { | |
| Get k -> (k eta, eta) `cast` <Co:6>; | |
| Put s k -> (k, s) `cast` <Co:6> | |
| } | |
| } | |
| -- RHS size: {terms: 2, types: 6, coercions: 0, joins: 0/0} | |
| lvl :: State (Sum Int) (Sum Int) | |
| lvl = Get @ (Sum Int) @ (Sum Int) (id @ (Sum Int)) | |
| -- RHS size: {terms: 2, types: 16, coercions: 11, joins: 0/0} | |
| lvl1 :: Union '[State (Sum Int)] (Sum Int) | |
| lvl1 | |
| = Union | |
| @ '[State (Sum Int)] @ (Sum Int) @ (State (Sum Int)) @~ <Co:11> lvl | |
| Rec { | |
| -- RHS size: {terms: 40, types: 80, coercions: 65, joins: 0/2} | |
| main_$sgo | |
| :: Int# | |
| -> (forall x. | |
| Union '[State (Sum Int)] x -> StateT (Sum Int) Identity x) | |
| -> StateT (Sum Int) Identity () | |
| main_$sgo | |
| = \ (x :: Int#) | |
| (eta | |
| :: forall x1. | |
| Union '[State (Sum Int)] x1 -> StateT (Sum Int) Identity x1) -> | |
| let { | |
| m1 :: StateT (Sum Int) Identity (Sum Int) | |
| m1 = eta @ (Sum Int) lvl1 } in | |
| let { | |
| ds1 :: StateT (Sum Int) Identity () | |
| ds1 | |
| = case x of wild { | |
| __DEFAULT -> main_$sgo (+# wild 1#) eta; | |
| 100# -> (\ (s1 :: Sum Int) -> ((), s1)) `cast` <Co:16> | |
| } } in | |
| (\ (s1 :: Sum Int) -> | |
| case ((m1 `cast` <Co:6>) s1) `cast` <Co:6> of { (a1, s') -> | |
| case a1 `cast` <Co:2> of { I# ipv -> | |
| case (((eta | |
| @ () | |
| (Union | |
| @ '[State (Sum Int)] | |
| @ () | |
| @ (State (Sum Int)) | |
| @~ <Co:11> | |
| (Put @ (Sum Int) @ () ((I# (+# ipv x)) `cast` <Co:3>) ()))) | |
| `cast` <Co:5>) | |
| s') | |
| `cast` <Co:5> | |
| of | |
| { (a2, s'1) -> | |
| (ds1 `cast` <Co:5>) s'1 | |
| } | |
| } | |
| }) | |
| `cast` <Co:6> | |
| end Rec } | |
| -- RHS size: {terms: 18, types: 20, coercions: 37, joins: 0/0} | |
| main1 :: String | |
| main1 | |
| = case (((main_$sgo 0# (main3 `cast` <Co:22>)) `cast` <Co:5>) | |
| (main2 `cast` <Co:3>)) | |
| `cast` <Co:5> | |
| of | |
| { (a1, b1) -> | |
| case b1 `cast` <Co:2> of { I# ww3 -> | |
| case $wshowSignedInt 0# ww3 ([] @ Char) of { (# ww5, ww6 #) -> | |
| : @ Char ww5 ww6 | |
| } | |
| } | |
| } | |
| -- RHS size: {terms: 4, types: 0, coercions: 0, joins: 0/0} | |
| main :: IO () | |
| main = hPutStr' stdout main1 True | |
| -- RHS size: {terms: 2, types: 1, coercions: 0, joins: 0/0} | |
| main4 :: State# RealWorld -> (# State# RealWorld, () #) | |
| main4 = runMainIO1 @ () main | |
| -- RHS size: {terms: 1, types: 0, coercions: 3, joins: 0/0} | |
| main :: IO () | |
| main = main4 `cast` <Co:3> | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Get3 :: Addr# | |
| $tc'Get3 = "'Get"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Get2 :: TrName | |
| $tc'Get2 = TrNameS $tc'Get3 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Put3 :: Addr# | |
| $tc'Put3 = "'Put"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Put2 :: TrName | |
| $tc'Put2 = TrNameS $tc'Put3 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tcState2 :: Addr# | |
| $tcState2 = "State"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tcState1 :: TrName | |
| $tcState1 = TrNameS $tcState2 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tcSemantic3 :: Addr# | |
| $tcSemantic3 = "Semantic"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tcSemantic2 :: TrName | |
| $tcSemantic2 = TrNameS $tcSemantic3 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Union3 :: Addr# | |
| $tc'Union3 = "'Union"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Union2 :: TrName | |
| $tc'Union2 = TrNameS $tc'Union3 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $tcUnion2 :: Addr# | |
| $tcUnion2 = "Union"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $tcUnion1 :: TrName | |
| $tcUnion1 = TrNameS $tcUnion2 | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $krep :: KindRep | |
| $krep = KindRepVar 0# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $krep1 :: KindRep | |
| $krep1 = KindRepVar 1# | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep2 :: KindRep | |
| $krep2 = KindRepFun $krep $krep1 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep3 :: KindRep | |
| $krep3 = KindRepApp $krep $krep1 | |
| -- RHS size: {terms: 3, types: 2, coercions: 0, joins: 0/0} | |
| $krep4 :: [KindRep] | |
| $krep4 = : @ KindRep $krep1 ([] @ KindRep) | |
| -- RHS size: {terms: 3, types: 1, coercions: 0, joins: 0/0} | |
| $krep5 :: [KindRep] | |
| $krep5 = : @ KindRep $krep $krep4 | |
| -- RHS size: {terms: 3, types: 2, coercions: 0, joins: 0/0} | |
| $krep6 :: [KindRep] | |
| $krep6 = : @ KindRep krep$*Arr* ([] @ KindRep) | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep7 :: KindRep | |
| $krep7 = KindRepTyConApp $tc[] $krep6 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $tcSemantic1 :: KindRep | |
| $tcSemantic1 = KindRepFun $krep7 krep$*Arr* | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep8 :: KindRep | |
| $krep8 = KindRepTyConApp $tc'[] $krep6 | |
| -- RHS size: {terms: 3, types: 2, coercions: 0, joins: 0/0} | |
| $krep9 :: [KindRep] | |
| $krep9 = : @ KindRep $krep8 ([] @ KindRep) | |
| -- RHS size: {terms: 3, types: 1, coercions: 0, joins: 0/0} | |
| $krep10 :: [KindRep] | |
| $krep10 = : @ KindRep $krep $krep9 | |
| -- RHS size: {terms: 3, types: 1, coercions: 0, joins: 0/0} | |
| $krep11 :: [KindRep] | |
| $krep11 = : @ KindRep krep$*Arr* $krep10 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep12 :: KindRep | |
| $krep12 = KindRepTyConApp $tc': $krep11 | |
| -- RHS size: {terms: 3, types: 1, coercions: 0, joins: 0/0} | |
| $krep13 :: [KindRep] | |
| $krep13 = : @ KindRep $krep12 $krep4 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $trModule2 :: Addr# | |
| $trModule2 = "Main"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $trModule1 :: TrName | |
| $trModule1 = TrNameS $trModule2 | |
| -- RHS size: {terms: 1, types: 0, coercions: 0, joins: 0/0} | |
| $trModule4 :: Addr# | |
| $trModule4 = "main"# | |
| -- RHS size: {terms: 2, types: 0, coercions: 0, joins: 0/0} | |
| $trModule3 :: TrName | |
| $trModule3 = TrNameS $trModule4 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $trModule :: Module | |
| $trModule = Module $trModule3 $trModule1 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tcUnion :: TyCon | |
| $tcUnion | |
| = TyCon | |
| 229884759504400770## | |
| 13528229582907927977## | |
| $trModule | |
| $tcUnion1 | |
| 0# | |
| $tcSemantic1 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep14 :: KindRep | |
| $krep14 = KindRepTyConApp $tcUnion $krep13 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Union1 :: KindRep | |
| $tc'Union1 = KindRepFun $krep3 $krep14 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Union :: TyCon | |
| $tc'Union | |
| = TyCon | |
| 6632976870638181383## | |
| 15290975553766063960## | |
| $trModule | |
| $tc'Union2 | |
| 2# | |
| $tc'Union1 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tcSemantic :: TyCon | |
| $tcSemantic | |
| = TyCon | |
| 9508779775375363839## | |
| 14545629556631013737## | |
| $trModule | |
| $tcSemantic2 | |
| 0# | |
| $tcSemantic1 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tcState :: TyCon | |
| $tcState | |
| = TyCon | |
| 11500382755588220783## | |
| 3741540518684525139## | |
| $trModule | |
| $tcState1 | |
| 0# | |
| krep$*->*->* | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep15 :: KindRep | |
| $krep15 = KindRepTyConApp $tcState $krep5 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $krep16 :: KindRep | |
| $krep16 = KindRepFun $krep1 $krep15 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Put1 :: KindRep | |
| $tc'Put1 = KindRepFun $krep $krep16 | |
| -- RHS size: {terms: 3, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Get1 :: KindRep | |
| $tc'Get1 = KindRepFun $krep2 $krep15 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Put :: TyCon | |
| $tc'Put | |
| = TyCon | |
| 15201137817969246407## | |
| 1251973250185875189## | |
| $trModule | |
| $tc'Put2 | |
| 2# | |
| $tc'Put1 | |
| -- RHS size: {terms: 7, types: 0, coercions: 0, joins: 0/0} | |
| $tc'Get :: TyCon | |
| $tc'Get | |
| = TyCon | |
| 4894226031785183458## | |
| 8801726891554456039## | |
| $trModule | |
| $tc'Get2 | |
| 2# | |
| $tc'Get1 | |
| -- RHS size: {terms: 27, types: 61, coercions: 6, joins: 0/2} | |
| $w$c>> | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Applicative m => | |
| (forall a1 b1. m a1 -> (a1 -> m b1) -> m b1) | |
| -> (forall a1 b1. m a1 -> m b1 -> m b1) | |
| -> (forall a1. a1 -> m a1) | |
| -> (forall x. Union f x -> m x) | |
| -> m b | |
| $w$c>> | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (w :: Semantic f a) | |
| (w1 :: Semantic f b) | |
| (@ (m :: * -> *)) | |
| (ww :: Applicative m) | |
| (ww1 :: forall a1 b1. m a1 -> (a1 -> m b1) -> m b1) | |
| (ww2 :: forall a1 b1. m a1 -> m b1 -> m b1) | |
| (ww3 :: forall a1. a1 -> m a1) | |
| (w2 :: forall x. Union f x -> m x) -> | |
| let { | |
| $dMonad :: Monad m | |
| $dMonad = C:Monad @ m ww ww1 ww2 ww3 } in | |
| let { | |
| lvl2 :: m b | |
| lvl2 = (w1 `cast` <Co:3>) @ m $dMonad w2 } in | |
| ww1 @ a @ b ((w `cast` <Co:3>) @ m $dMonad w2) (\ _ -> lvl2) | |
| -- RHS size: {terms: 19, types: 59, coercions: 0, joins: 0/0} | |
| $c>> | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m b | |
| $c>> | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (w :: Semantic f a) | |
| (w1 :: Semantic f b) | |
| (@ (m :: * -> *)) | |
| (w2 :: Monad m) | |
| (w3 :: forall x. Union f x -> m x) -> | |
| case w2 of { C:Monad ww1 ww2 ww3 ww4 -> | |
| $w$c>> @ f @ a @ b w w1 @ m ww1 ww2 ww3 ww4 w3 | |
| } | |
| -- RHS size: {terms: 1, types: 0, coercions: 22, joins: 0/0} | |
| $fMonadSemantic_$c>> | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a -> Semantic f b -> Semantic f b | |
| $fMonadSemantic_$c>> = $c>> `cast` <Co:22> | |
| -- RHS size: {terms: 26, types: 60, coercions: 6, joins: 0/1} | |
| $w$c>>= | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a | |
| -> (a -> Semantic f b) | |
| -> forall (m :: * -> *). | |
| Applicative m => | |
| (forall a1 b1. m a1 -> (a1 -> m b1) -> m b1) | |
| -> (forall a1 b1. m a1 -> m b1 -> m b1) | |
| -> (forall a1. a1 -> m a1) | |
| -> (forall x. Union f x -> m x) | |
| -> m b | |
| $w$c>>= | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (w :: Semantic f a) | |
| (w1 :: a -> Semantic f b) | |
| (@ (m :: * -> *)) | |
| (ww :: Applicative m) | |
| (ww1 :: forall a1 b1. m a1 -> (a1 -> m b1) -> m b1) | |
| (ww2 :: forall a1 b1. m a1 -> m b1 -> m b1) | |
| (ww3 :: forall a1. a1 -> m a1) | |
| (w2 :: forall x. Union f x -> m x) -> | |
| let { | |
| $dMonad :: Monad m | |
| $dMonad = C:Monad @ m ww ww1 ww2 ww3 } in | |
| ww1 | |
| @ a | |
| @ b | |
| ((w `cast` <Co:3>) @ m $dMonad w2) | |
| (\ (z1 :: a) -> ((w1 z1) `cast` <Co:3>) @ m $dMonad w2) | |
| -- RHS size: {terms: 19, types: 60, coercions: 0, joins: 0/0} | |
| $c>>= | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a | |
| -> (a -> Semantic f b) | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m b | |
| $c>>= | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (w :: Semantic f a) | |
| (w1 :: a -> Semantic f b) | |
| (@ (m :: * -> *)) | |
| (w2 :: Monad m) | |
| (w3 :: forall x. Union f x -> m x) -> | |
| case w2 of { C:Monad ww1 ww2 ww3 ww4 -> | |
| $w$c>>= @ f @ a @ b w w1 @ m ww1 ww2 ww3 ww4 w3 | |
| } | |
| -- RHS size: {terms: 1, types: 0, coercions: 23, joins: 0/0} | |
| $fMonadSemantic_$c>>= | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a -> (a -> Semantic f b) -> Semantic f b | |
| $fMonadSemantic_$c>>= = $c>>= `cast` <Co:23> | |
| -- RHS size: {terms: 9, types: 21, coercions: 3, joins: 0/0} | |
| runSemantic | |
| :: forall (r :: [* -> *]) a. | |
| Semantic r a | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union r x -> m x) -> m a | |
| runSemantic | |
| = \ (@ (r :: [* -> *])) | |
| (@ a) | |
| (dk :: Semantic r a) | |
| (@ (m :: * -> *)) | |
| ($dMonad :: Monad m) | |
| (ds :: forall x. Union r x -> m x) -> | |
| (dk `cast` <Co:3>) @ m $dMonad ds | |
| -- RHS size: {terms: 18, types: 23, coercions: 0, joins: 0/0} | |
| $fFunctorState_$cfmap | |
| :: forall s a b. (a -> b) -> State s a -> State s b | |
| $fFunctorState_$cfmap | |
| = \ (@ s) (@ a) (@ b) (f :: a -> b) (ds :: State s a) -> | |
| case ds of { | |
| Get a1 -> Get @ s @ b (\ (b3 :: s) -> f (a1 b3)); | |
| Put a1 a2 -> Put @ s @ b a1 (f a2) | |
| } | |
| -- RHS size: {terms: 15, types: 22, coercions: 0, joins: 0/0} | |
| $fFunctorState_$c<$ :: forall s a b. a -> State s b -> State s a | |
| $fFunctorState_$c<$ | |
| = \ (@ s) (@ a) (@ b) (z1 :: a) (ds :: State s b) -> | |
| case ds of { | |
| Get a1 -> Get @ s @ a (\ _ -> z1); | |
| Put a1 a2 -> Put @ s @ a a1 z1 | |
| } | |
| -- RHS size: {terms: 4, types: 6, coercions: 0, joins: 0/0} | |
| $fFunctorState :: forall s. Functor (State s) | |
| $fFunctorState | |
| = \ (@ s) -> | |
| C:Functor | |
| @ (State s) ($fFunctorState_$cfmap @ s) ($fFunctorState_$c<$ @ s) | |
| -- RHS size: {terms: 24, types: 42, coercions: 6, joins: 0/0} | |
| $fApplicativeSemantic2 | |
| :: forall (f :: [* -> *]) a b c. | |
| (a -> b -> c) | |
| -> Semantic f a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m c | |
| $fApplicativeSemantic2 | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (@ c) | |
| (f1 :: a -> b -> c) | |
| (x :: Semantic f a) | |
| (eta :: Semantic f b) | |
| (@ (m :: * -> *)) | |
| (eta1 :: Monad m) | |
| (eta2 :: forall x1. Union f x1 -> m x1) -> | |
| <*> | |
| @ m | |
| ($p1Monad @ m eta1) | |
| @ b | |
| @ c | |
| (fmap | |
| @ m | |
| ($p1Applicative @ m ($p1Monad @ m eta1)) | |
| @ a | |
| @ (b -> c) | |
| f1 | |
| ((x `cast` <Co:3>) @ m eta1 eta2)) | |
| ((eta `cast` <Co:3>) @ m eta1 eta2) | |
| -- RHS size: {terms: 5, types: 13, coercions: 0, joins: 0/0} | |
| $fApplicativeSemantic1 | |
| :: forall b a (f :: [* -> *]). | |
| Semantic f a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m a | |
| $fApplicativeSemantic1 | |
| = \ (@ b) (@ a) (@ (f :: [* -> *])) -> | |
| $fApplicativeSemantic2 @ f @ a @ b @ a (const @ a @ b) | |
| -- RHS size: {terms: 12, types: 23, coercions: 0, joins: 0/1} | |
| $cpure | |
| :: forall (f :: [* -> *]) a. | |
| a | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m a | |
| $cpure | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (a1 :: a) | |
| (@ (m :: * -> *)) | |
| ($dMonad :: Monad m) -> | |
| let { | |
| ds :: m a | |
| ds = pure @ m ($p1Monad @ m $dMonad) @ a a1 } in | |
| \ _ -> ds | |
| -- RHS size: {terms: 1, types: 0, coercions: 13, joins: 0/0} | |
| $fApplicativeSemantic_$cpure | |
| :: forall (f :: [* -> *]) a. a -> Semantic f a | |
| $fApplicativeSemantic_$cpure = $cpure `cast` <Co:13> | |
| -- RHS size: {terms: 17, types: 32, coercions: 7, joins: 0/0} | |
| $c<*> | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f (a -> b) | |
| -> Semantic f a | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m b | |
| $c<*> | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (ds :: Semantic f (a -> b)) | |
| (ds1 :: Semantic f a) | |
| (@ (m :: * -> *)) | |
| ($dMonad :: Monad m) | |
| (eta :: forall x. Union f x -> m x) -> | |
| <*> | |
| @ m | |
| ($p1Monad @ m $dMonad) | |
| @ a | |
| @ b | |
| ((ds `cast` <Co:4>) @ m $dMonad eta) | |
| ((ds1 `cast` <Co:3>) @ m $dMonad eta) | |
| -- RHS size: {terms: 1, types: 0, coercions: 23, joins: 0/0} | |
| $fApplicativeSemantic_$c<*> | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f (a -> b) -> Semantic f a -> Semantic f b | |
| $fApplicativeSemantic_$c<*> = $c<*> `cast` <Co:23> | |
| -- RHS size: {terms: 17, types: 30, coercions: 3, joins: 0/0} | |
| $fApplicativeSemantic4 | |
| :: forall (f :: [* -> *]) a b. | |
| a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m a | |
| $fApplicativeSemantic4 | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (x :: a) | |
| (eta :: Semantic f b) | |
| (@ (m :: * -> *)) | |
| (eta1 :: Monad m) | |
| (eta2 :: forall x1. Union f x1 -> m x1) -> | |
| fmap | |
| @ m | |
| ($p1Applicative @ m ($p1Monad @ m eta1)) | |
| @ b | |
| @ a | |
| (\ _ -> x) | |
| ((eta `cast` <Co:3>) @ m eta1 eta2) | |
| -- RHS size: {terms: 16, types: 30, coercions: 3, joins: 0/0} | |
| $cfmap | |
| :: forall (f :: [* -> *]) a b. | |
| (a -> b) | |
| -> Semantic f a | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m b | |
| $cfmap | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (f1 :: a -> b) | |
| (ds :: Semantic f a) | |
| (@ (m :: * -> *)) | |
| ($dMonad :: Monad m) | |
| (eta :: forall x. Union f x -> m x) -> | |
| fmap | |
| @ m | |
| ($p1Applicative @ m ($p1Monad @ m $dMonad)) | |
| @ a | |
| @ b | |
| f1 | |
| ((ds `cast` <Co:3>) @ m $dMonad eta) | |
| -- RHS size: {terms: 1, types: 0, coercions: 21, joins: 0/0} | |
| $fFunctorSemantic_$cfmap | |
| :: forall (f :: [* -> *]) a b. | |
| (a -> b) -> Semantic f a -> Semantic f b | |
| $fFunctorSemantic_$cfmap = $cfmap `cast` <Co:21> | |
| -- RHS size: {terms: 4, types: 7, coercions: 16, joins: 0/0} | |
| $fFunctorSemantic :: forall (f :: [* -> *]). Functor (Semantic f) | |
| $fFunctorSemantic | |
| = \ (@ (f :: [* -> *])) -> | |
| C:Functor | |
| @ (Semantic f) | |
| ($fFunctorSemantic_$cfmap @ f) | |
| (($fApplicativeSemantic4 @ f) `cast` <Co:16>) | |
| -- RHS size: {terms: 19, types: 36, coercions: 3, joins: 0/0} | |
| $fApplicativeSemantic3 | |
| :: forall (f :: [* -> *]) a b. | |
| Semantic f a | |
| -> Semantic f b | |
| -> forall (m :: * -> *). | |
| Monad m => | |
| (forall x. Union f x -> m x) -> m b | |
| $fApplicativeSemantic3 | |
| = \ (@ (f :: [* -> *])) | |
| (@ a) | |
| (@ b) | |
| (a1 :: Semantic f a) | |
| (a2 :: Semantic f b) | |
| (@ (m :: * -> *)) | |
| (eta :: Monad m) | |
| (eta1 :: forall x. Union f x -> m x) -> | |
| <*> | |
| @ m | |
| ($p1Monad @ m eta) | |
| @ b | |
| @ b | |
| ($fApplicativeSemantic4 | |
| @ f @ (b -> b) @ a (breakpoint @ b) a1 @ m eta eta1) | |
| ((a2 `cast` <Co:3>) @ m eta eta1) | |
| -- RHS size: {terms: 10, types: 17, coercions: 61, joins: 0/0} | |
| $fApplicativeSemantic | |
| :: forall (f :: [* -> *]). Applicative (Semantic f) | |
| $fApplicativeSemantic | |
| = \ (@ (f :: [* -> *])) -> | |
| C:Applicative | |
| @ (Semantic f) | |
| ($fFunctorSemantic @ f) | |
| ($fApplicativeSemantic_$cpure @ f) | |
| ($fApplicativeSemantic_$c<*> @ f) | |
| (($fApplicativeSemantic2 @ f) `cast` <Co:25>) | |
| (($fApplicativeSemantic3 @ f) `cast` <Co:18>) | |
| ((\ (@ a) (@ b) -> $fApplicativeSemantic1 @ b @ a @ f) | |
| `cast` <Co:18>) | |
| -- RHS size: {terms: 6, types: 9, coercions: 0, joins: 0/0} | |
| $fMonadSemantic :: forall (f :: [* -> *]). Monad (Semantic f) | |
| $fMonadSemantic | |
| = \ (@ (f :: [* -> *])) -> | |
| C:Monad | |
| @ (Semantic f) | |
| ($fApplicativeSemantic @ f) | |
| ($fMonadSemantic_$c>>= @ f) | |
| ($fMonadSemantic_$c>> @ f) | |
| ($fApplicativeSemantic_$cpure @ f) | |
Author
Author
after !668, -flate-specialise -O2 -fstatic-argument-transformation -fmax-simplifier-iterations=10:
Rec {
-- RHS size: {terms: 22, types: 132, coercions: 5, joins: 0/0}
main3
:: ((forall x.
Union '[State Int] (Semantic '[State Int]) x
-> Int -> Identity (x, Int))
~R# (forall x.
Union '[State Int] (Semantic '[State Int]) x
-> StateT Int Identity x))
-> Applicative (StateT Int Identity) => Int -> Identity (Int, Int)
main3
= \ (sg_s6rY
:: (forall x.
Union '[State Int] (Semantic '[State Int]) x
-> Int -> Identity (x, Int))
~R# (forall x.
Union '[State Int] (Semantic '[State Int]) x
-> StateT Int Identity x))
(sc_s6rX :: Applicative (StateT Int Identity))
(eta_B1 :: Int) ->
case eta_B1 of wild_a5Hp { I# x_a5Hr ->
case <=# x_a5Hr 0# of {
__DEFAULT -> main3 @~ <Co:1> sc_s6rX (I# (-# x_a5Hr 1#));
1# ->
((pure @ (StateT Int Identity) sc_s6rX @ Int wild_a5Hp)
`cast` <Co:4>)
wild_a5Hp
}
}
end Rec }
Author
after keeping EVERYTHING + the simplcore changes:
Rec {
-- RHS size: {terms: 18, types: 6, coercions: 8, joins: 0/0}
main2 :: Int -> Identity (Int, Int)
main2
= \ (s1_a6pN :: Int) ->
case s1_a6pN of wild_a5Hp { I# x_a5Hr ->
case <=# x_a5Hr 0# of {
__DEFAULT -> main2 (I# (-# x_a5Hr 1#));
1# -> (wild_a5Hp, wild_a5Hp) `cast` <Co:8>
}
}
end Rec }
-- RHS size: {terms: 17, types: 18, coercions: 4, joins: 0/0}
main1 :: String
main1
= case (main2 (I# 100#)) `cast` <Co:4> of { (a_a2BS, b_a2BT) ->
case b_a2BT of { I# ww3_a5Lf ->
case $wshowSignedInt 0# ww3_a5Lf ([] @ Char) of
{ (# ww5_a5Lj, ww6_a5Lk #) ->
: @ Char ww5_a5Lj ww6_a5Lk
}
}
}
-- RHS size: {terms: 4, types: 0, coercions: 0, joins: 0/0}
main :: IO ()
main = hPutStr' stdout main1 Truecompletely free abstraction :) :) :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UnicodeSyntax #-} module MVP (main) where import qualified Control.Monad.Trans.State.Strict as S import Data.Coerce import Data.Functor.Compose import Data.Functor.Identity import Data.Typeable newtype Semantic r a = Semantic { runSemantic :: ∀ m . Monad m => (∀ x. Union r (Semantic r) x -> m x) -> m a } usingSemantic :: Monad m => (∀ x. Union r (Semantic r) x -> m x) -> Semantic r a -> m a usingSemantic k m = runSemantic m k {-# INLINE usingSemantic #-} instance Functor (Semantic f) where fmap f (Semantic m) = Semantic $ \k -> fmap f $ m k {-# INLINE fmap #-} instance Applicative (Semantic f) where pure a = Semantic $ const $ pure a {-# INLINE pure #-} Semantic f <*> Semantic a = Semantic $ \k -> f k <*> a k {-# INLINE (<*>) #-} instance Monad (Semantic f) where return = pure {-# INLINE return #-} Semantic ma >>= f = Semantic $ \k -> do z <- ma k runSemantic (f z) k {-# INLINE (>>=) #-} liftSemantic :: Union r (Semantic r) a -> Semantic r a liftSemantic u = Semantic $ \k -> k u {-# INLINE liftSemantic #-} hoistSemantic :: (∀ x. Union r (Semantic r) x -> Union r' (Semantic r') x) -> Semantic r a -> Semantic r' a hoistSemantic nat (Semantic m) = Semantic $ \k -> m $ \u -> k $ nat u {-# INLINE hoistSemantic #-} raise :: forall e r a. Semantic r a -> Semantic (e ': r) a raise = hoistSemantic $ hoist raise' . weaken {-# INLINE raise #-} raise' :: Semantic r a -> Semantic (e ': r) a raise' = raise {-# NOINLINE raise' #-} send :: Member e r => e (Semantic r) a -> Semantic r a send = liftSemantic . inj {-# INLINE[3] send #-} sendM :: Member (Lift m) r => m a -> Semantic r a sendM = send . Lift {-# INLINE sendM #-} run :: Semantic '[] a -> a run (Semantic m) = runIdentity $ m absurdU {-# INLINE run #-} runM :: Monad m => Semantic '[Lift m] a -> m a runM (Semantic m) = m $ \z -> case extract z of Yo e s _ f -> do a <- unLift e pure $ f $ a <$ s {-# INLINE runM #-} slowBeforeSpecialization :: Member (State Int) r => Semantic r Int slowBeforeSpecialization = do n <- get if n <= 0 then pure n else do put $ n - 1 slowBeforeSpecialization main :: IO () main = print $ countDown 100 countDown :: Int -> Int countDown s = fst . run . runState s $ slowBeforeSpecialization data State s m a where Get :: State s m s Put :: s -> State s m () get :: Member (State s) r => Semantic r s get = send Get {-# INLINE get #-} put :: Member (State s) r => s -> Semantic r () put = send . Put {-# INLINE put #-} gets :: Member (State s) r => (s -> a) -> Semantic r a gets f = fmap f get {-# INLINE gets #-} modify :: Member (State s) r => (s -> s) -> Semantic r () modify f = do s <- get put $ f s {-# INLINE modify #-} runState :: s -> Semantic (State s ': r) a -> Semantic r (s, a) runState = stateful $ \case Get -> \s -> pure (s, s) Put s -> const $ pure (s, ()) {-# INLINE[3] runState #-} {-# RULES "runState/reinterpret" forall s e (f :: forall m x. e m x -> Semantic (State s ': r) x). runState s (reinterpret f e) = stateful (\x s' -> runState s' $ f x) s e #-} swap :: (a, b) -> (b, a) swap ~(a, b) = (b, a) {-# INLINE swap #-} type Tactically m r x = ∀ f. Functor f => Semantic (Tactics f m r ': r) (f x) interpretH :: forall e r a . (∀ x m . e m x -> Tactically m r x) -> Semantic (e ': r) a -> Semantic r a interpretH f (Semantic m) = m $ \u -> case decomp u of Left x -> liftSemantic $ hoist (interpretH f) x Right (Yo e s d y) -> do a <- runTactics s (interpretH f . d) (f e) pure $ y a {-# INLINE interpretH #-} interpret :: (∀ x m. e m x -> Semantic r x) -> Semantic (e ': r) a -> Semantic r a interpret f = interpretH $ \(e :: e m x) -> toH @m $ f e {-# INLINE interpret #-} interpretInStateT :: (∀ x m. e m x -> S.StateT s (Semantic r) x) -> s -> Semantic (e ': r) a -> Semantic r (s, a) interpretInStateT f s (Semantic m) = Semantic $ \k -> fmap swap $ flip S.runStateT s $ m $ \u -> case decomp u of Left x -> S.StateT $ \s' -> k . fmap swap . weave (s', ()) (uncurry $ interpretInStateT_b f) $ x Right (Yo e z _ y) -> fmap (y . (<$ z)) $ S.mapStateT (usingSemantic k) $ f e {-# INLINE interpretInStateT #-} interpretInStateT_b :: (∀ x m. e m x -> S.StateT s (Semantic r) x) -> s -> Semantic (e ': r) a -> Semantic r (s, a) interpretInStateT_b = interpretInStateT {-# NOINLINE interpretInStateT_b #-} reinterpretH :: forall e2 e1 r a . (∀ m x. e1 m x -> Tactically m (e2 ': r) x) -> Semantic (e1 ': r) a -> Semantic (e2 ': r) a reinterpretH f (Semantic m) = Semantic $ \k -> m $ \u -> case decompCoerce u of Left x -> k $ hoist (reinterpretH f) $ x Right (Yo e s d y) -> do a <- usingSemantic k $ runTactics s (reinterpretH f . d) $ f e pure $ y a {-# INLINE[3] reinterpretH #-} reinterpret2H :: forall e2 e3 e1 r a . (∀ m x. e1 m x -> Tactically m (e2 ': e3 ': r) x) -> Semantic (e1 ': r) a -> Semantic (e2 ': e3 ': r) a reinterpret2H f (Semantic m) = Semantic $ \k -> m $ \u -> case decompCoerce u of Left x -> k $ weaken $ hoist (reinterpret2H f) $ x Right (Yo e s d y) -> do a <- usingSemantic k $ runTactics s (reinterpret2H f . d) $ f e pure $ y a {-# INLINE[3] reinterpret2H #-} interceptH :: forall e r a. Member e r => (∀ x m. e m x -> Tactically m r x) -> Semantic r a -> Semantic r a interceptH f (Semantic m) = Semantic $ \k -> m $ \u -> case prj @e u of Just (Yo e s d y) -> usingSemantic k $ fmap y $ runTactics s d $ f e Nothing -> k u {-# INLINE interceptH #-} stateful :: (∀ x m. e m x -> s -> Semantic r (s, x)) -> s -> Semantic (e ': r) a -> Semantic r (s, a) stateful f = interpretInStateT $ \e -> S.StateT $ fmap swap . f e {-# INLINE[3] stateful #-} reinterpret :: forall e2 e1 r a . (∀ m x. e1 m x -> Semantic (e2 ': r) x) -> Semantic (e1 ': r) a -> Semantic (e2 ': r) a reinterpret f = reinterpretH $ \(e :: e m x) -> toH @m $ f e {-# INLINE[3] reinterpret #-} reinterpret2 :: forall e2 e3 e1 r a . (∀ m x. e1 m x -> Semantic (e2 ': e3 ': r) x) -> Semantic (e1 ': r) a -> Semantic (e2 ': e3 ': r) a reinterpret2 f = reinterpret2H $ \(e :: e m x) -> toH @m $ f e {-# INLINE[3] reinterpret2 #-} intercept :: forall e r a. Member e r => (∀ x m. e m x -> Semantic r x) -> Semantic r a -> Semantic r a intercept f (Semantic m) = Semantic $ \k -> m $ \u -> case prj @e u of Just (Yo e s _ y) -> usingSemantic k $ fmap (y . (<$ s)) $ f e Nothing -> k u {-# INLINE intercept #-} data Union (r :: [(* -> *) -> * -> *]) (m :: * -> *) a where Union :: SNat n -- ^ A proof that the effect is actually in @r@. -> Yo (IndexOf r n) m a -- ^ The effect to wrap. The functions 'prj' and 'decomp' can help -- retrieve this value later. -> Union r m a data Yo e m a where Yo :: (Functor f) => e m a -> f () -> (forall x. f (m x) -> n (f x)) -> (f a -> b) -> Yo e n b liftYo :: Functor m => e m a -> Yo e m a liftYo e = Yo e (Identity ()) (fmap Identity . runIdentity) runIdentity instance Functor (Yo e m) where fmap f (Yo e s d f') = Yo e s d (f . f') instance Effect (Yo e) where weave s' d (Yo e s nt f) = Yo e (Compose $ s <$ s') (fmap Compose . d . fmap nt . getCompose) (fmap f . getCompose) hoist = defaultHoist instance (Functor m) => Functor (Union r m) where fmap f (Union w t) = Union w $ fmap' f t where -- This is necessary to delay the interaction between the type family -- 'IndexOf' and the quantified superclass constraint on 'Effect'. fmap' :: (Functor m, Effect f) => (a -> b) -> f m a -> f m b fmap' = fmap {-# INLINE fmap' #-} {-# INLINE fmap #-} instance Effect (Union r) where weave s f (Union w e) = Union w $ weave s f e {-# INLINE weave #-} hoist f (Union w e) = Union w $ hoist f e {-# INLINE hoist #-} type Member e r = ( Find r e -- , Break (AmbiguousSend r e) (IndexOf r (Found r e)) , e ~ IndexOf r (Found r e) -- , Effect e ) data Dict c where Dict :: c => Dict c induceTypeable :: SNat n -> Dict (Typeable n) induceTypeable SZ = Dict induceTypeable (SS _) = Dict {-# INLINE induceTypeable #-} data Nat = Z | S Nat deriving Typeable data SNat :: Nat -> * where SZ :: SNat 'Z SS :: Typeable n => SNat n -> SNat ('S n) deriving Typeable type family IndexOf (ts :: [k]) (n :: Nat) :: k where IndexOf (k ': ks) 'Z = k IndexOf (k ': ks) ('S n) = IndexOf ks n type family Found (ts :: [k]) (t :: k) :: Nat where Found (t ': ts) t = 'Z Found (u ': ts) t = 'S (Found ts t) class Typeable (Found r t) => Find (r :: [k]) (t :: k) where finder :: SNat (Found r t) instance {-# OVERLAPPING #-} Find (t ': z) t where finder = SZ {-# INLINE finder #-} instance ( Find z t , Found (_1 ': z) t ~ 'S (Found z t) ) => Find (_1 ': z) t where finder = SS $ finder @_ @z @t {-# INLINE finder #-} decomp :: Union (e ': r) m a -> Either (Union r m a) (Yo e m a) decomp (Union p a) = case p of SZ -> Right a SS n -> Left $ Union n a {-# INLINE decomp #-} extract :: Union '[e] m a -> Yo e m a extract (Union SZ a) = a extract _ = error "impossible" {-# INLINE extract #-} absurdU :: Union '[] m a -> b absurdU = absurdU weaken :: Union r m a -> Union (e ': r) m a weaken (Union n a) = case induceTypeable n of Dict -> Union (SS n) a {-# INLINE weaken #-} inj :: forall r e a m. (Functor m , Member e r) => e m a -> Union r m a inj e = Union (finder @_ @r @e) $ liftYo e {-# INLINE inj #-} prj :: forall e r a m . ( Member e r ) => Union r m a -> Maybe (Yo e m a) prj (Union (s :: SNat n) a) = case induceTypeable s of Dict -> case eqT @n @(Found r e) of Just Refl -> Just a Nothing -> Nothing {-# INLINE prj #-} decompCoerce :: Union (e ': r) m a -> Either (Union (f ': r) m a) (Yo e m a) decompCoerce (Union p a) = case p of SZ -> Right a SS n -> Left (Union (SS n) a) {-# INLINE decompCoerce #-} class (∀ m. Functor m => Functor (e m)) => Effect e where weave :: (Functor s, Functor m, Functor n) => s () -> (∀ x. s (m x) -> n (s x)) -> e m a -> e n (s a) default weave :: ( Coercible (e m (s a)) (e n (s a)) , Functor s , Functor m , Functor n ) => s () -> (∀ x. s (m x) -> n (s x)) -> e m a -> e n (s a) weave s _ = coerce . fmap (<$ s) {-# INLINE weave #-} hoist :: ( Functor m , Functor n ) => (∀ x. m x -> n x) -> e m a -> e n a default hoist :: ( Coercible (e m a) (e n a) , Functor m ) => (∀ x. m x -> n x) -> e m a -> e n a hoist _ = coerce {-# INLINE hoist #-} defaultHoist :: ( Functor m , Functor n , Effect e ) => (∀ x. m x -> n x) -> e m a -> e n a defaultHoist f = fmap runIdentity . weave (Identity ()) (fmap Identity . f . runIdentity) {-# INLINE defaultHoist #-} newtype Lift m z a = Lift { unLift :: m a } data Tactics f n r m a where GetInitialState :: Tactics f n r m (f ()) HoistInterpretation :: (a -> n b) -> Tactics f n r m (f a -> Semantic r (f b)) start :: forall f n r r' a . Member (Tactics f n r) r' => n a -> Semantic r' (Semantic r (f a)) start na = do istate <- send @(Tactics f n r) GetInitialState na' <- continue (const na) pure $ na' istate continue :: Member (Tactics f n r) r' => (a -> n b) -> Semantic r' (f a -> Semantic r (f b)) continue f = send $ HoistInterpretation f toH :: forall n f r r' a e . ( Functor f , r' ~ (e : r) , Member (Tactics f n r) r' ) => Semantic r a -> Semantic r' (f a) toH m = do istate <- send @(Tactics f n r) GetInitialState raise $ fmap (<$ istate) m runTactics :: Functor f => f () -> (∀ x. f (m x) -> Semantic r (f x)) -> Semantic (Tactics f m r ': r) a -> Semantic r a runTactics s d (Semantic m) = m $ \u -> case decomp u of Left x -> liftSemantic $ hoist (runTactics s d) x Right (Yo GetInitialState s' _ y) -> pure $ y $ s <$ s' Right (Yo (HoistInterpretation na) s' _ y) -> do pure $ y $ (d . fmap na) <$ s' {-# INLINE runTactics #-}freer mvp