fork(1) download
  1. import Control.Monad
  2.  
  3. data Tree a
  4. = Nil
  5. | Branch a (Tree a) (Tree a)
  6. deriving (Show, Eq)
  7.  
  8. notEach :: Tree Bool -> [Tree Bool]
  9. notEach x = go id x []
  10. where
  11. go :: (Tree Bool -> Tree Bool) -> Tree Bool -> [Tree Bool] -> [Tree Bool]
  12. go f Nil = id
  13. go f (Branch b l r) =
  14. (f (Branch (not b) l r) :) .
  15. go (f . \n -> Branch b n r) l .
  16. go (f . \n -> Branch b l n) r
  17.  
  18. procreateL :: Int -> Tree Bool
  19. procreateL 0 = Nil
  20. procreateL n = Branch (n `rem` 2 == 0) (procreateL (n - 1)) (procreateL (n `div` 2))
  21.  
  22. procreateR :: Int -> Tree Bool
  23. procreateR 0 = Nil
  24. procreateR n = Branch (n `rem` 2 == 0) (procreateR (n `div` 2)) (procreateR (n - 1))
  25.  
  26. test :: IO ()
  27. test = do
  28. guard $ notEach (procreateL 3) == [Branch True (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch False (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch True Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch False Nil Nil) (Branch True Nil Nil)) (Branch False Nil Nil),Branch False (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch True Nil Nil)]
  29. guard $ notEach (procreateR 3) == [Branch True (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch True Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch False (Branch False Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch True (Branch True Nil Nil) (Branch False Nil Nil)),Branch False (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch True Nil Nil))]
  30. guard $ length (notEach $ procreateL 150) == 1564307
  31. guard $ length (notEach $ procreateR 150) == 1564307
  32.  
  33. main = test
Success #stdin #stdout 0.62s 134428KB
stdin
Standard input is empty
stdout
Standard output is empty