dataPatToGen :: MonadRandom m
  => (b -> m (DataTree c)) -- ^ what to do at the leaves
  -> DataPat' c b -> m (DataTree c)
dataPatToGen leafGen (DPCon c args) =
  liftM (DCon c) $ mapM (dataPatToGen leafGen) args
dataPatToGen :: MonadRandom m
  => (b -> m (DataTree c)) -- ^ what to do at the leaves
  -> DataPat' c b -> m (DataTree c)
dataPatToGen leafGen (DPCon c args) =
  liftM (DCon c) $ mapM (dataPatToGen leafGen) args
dataPatToGen leafGen (DPCon c args) =
  liftM (DCon c) $ mapM (dataPatToGen leafGen) args