@@ -359,20 +359,24 @@ x `usingIO` strat = runEvalIO (strat x)
359359withStrategyIO  ::  Strategy  a  ->  a  ->  IO a 
360360withStrategyIO =  flip  usingIO
361361
362- --  |  Compose two strategies sequentially. 
363- --  This is the analogue to function composition on strategies. 
362+ --  |  Compose two strategies. 
364363-- 
365- --  For any strategies @strat1@, @strat2@, and @strat3@, 
364+ --  > strat2 `dot` strat1 == strat2 . withStrategy strat1 
365+ -- 
366+ --  'dot' is associative: 
366367-- 
367368--  > (strat1 `dot` strat2) `dot` strat3 == strat1 `dot` (strat2 `dot` strat3) 
368- --  > strat1 `dot` strat1 = strat1 
369- --  > strat1 `dot` r0 == strat1 
370369-- 
371- --  > strat2 `dot` strat1 == strat2 . withStrategy strat1  
370+ --  'r0' and 'rseq' are one-sided identities of 'dot':  
372371-- 
372+ --  > strat `dot` r0 == strat 
373+ --  > strat `dot` rseq == strat 
374+ {-# DEPRECATED  dot "'dot' is an unintuitive composition operator. Use 'Control.Monad.<=<` instead." #-}
373375dot  ::  Strategy  a  ->  Strategy  a  ->  Strategy  a 
374376strat2 `dot`  strat1 =  strat2 .  runEval .  strat1
375377
378+ --  Note [dot proofs]
379+ --  ~~~~~~~~~~~~~~~~~
376380--  Proof of strat2 `dot` strat1 == strat2 . withStrategy strat1
377381-- 
378382--     strat2 . withStrategy strat1
@@ -381,17 +385,14 @@ strat2 `dot` strat1 = strat2 . runEval . strat1
381385--  == \x -> strat2 (runEval (strat1 x))
382386--  == \x -> (strat2 . runEval . strat1) x
383387--  == strat2 `dot` strat1
384- 
385- --  One might be tempted to think that 'dot' is equivalent to '(<=<)',
386- --  the right-to-left Kleisli composition in the Eval monad, because
387- --  '(<=<)' can take the type @Strategy a -> Strategy a -> Strategy a@
388- --  and intuitively does what 'dot' does: First apply the strategy to the
389- --  right then the one to the left. However, there is a subtle difference
390- --  in strictness, witnessed by the following example:
391388-- 
392- --  > (r0 `dot` rseq) undefined == Done undefined
393- --  > (r0 <=< rseq) undefined == undefined
389+ --  Proof of associativity
394390-- 
391+ --     (strat1 `dot` strat2) `dot` strat3
392+ --  == (strat1 . runEval . strat2) . runEval . strat3
393+ --  == strat1 . runEval . strat2 . runEval . strat3
394+ --  == strat1 . runEval . (strat2 . runEval . strat3)
395+ --  == strat1 `dot` (strat2 `dot` strat3)
395396
396397--  |  Inject a sequential strategy (i.e., coerce a sequential strategy 
397398--  to a general strategy). 
0 commit comments