evolve' :: Evolvable a => 
  Int -> EvOptions a -> EvData a -> Population a -> IO (Population a)
evolve' n evo@(EvOptions{..}) datum pop = 
  if n >= eMaxGen 
    then return pop
    else do
      next <- oneStep evo datum pop
      if snd (getBestFit datum next) >= eTarget
        then return next
        else evolve' (n+1) evo datum pop
evolve' :: Evolvable a => 
  Int -> EvOptions a -> EvData a -> Population a -> IO (Population a)
evolve' n evo@(EvOptions{..}) datum pop = 
  if n >= eMaxGen 
    then return pop
    else do
      next <- oneStep evo datum pop
      if snd (getBestFit datum next) >= eTarget
        then return next
        else evolve' (n+1) evo datum pop
evolve' n evo@(EvOptions{..}) datum pop = 
  if n >= eMaxGen 
    then return pop
    else do
      next <- oneStep evo datum pop
      if snd (getBestFit datum next) >= eTarget
        then return next
        else evolve' (n+1) evo datum pop