Greetings!
 
A second, and my main reason for short names, or rather against long
names, is that names should be to the point. None of the names

  newPrimes
  topPrime
  doFactors
  doFilter

accurately describe the object they represent. The primes are not "new",
the prime is not "on top". The "do" is a prefix does not carry a meaning
either, it just conveys that  doFactors  has something to do with
factors . This is best expressed by making  doFactors  a local
definition in the where-block of  factors.

Those remarks are fine with me! I asked about the stylistic changes because I came from the, hm, Java world and would like to avoid "writing familiar things in unfamiliar language". In Java, factors() and doFactors() would be a perfectly named methods: factors() is public, auxiliary doFactors() is private and essentially _does_ the factoring.
 
> Out of curiosity, there is any reason why you called the auxiliary function
> 'go' ?

Convention. Often, an auxiliary function that does basically the same
thing as the main function  factors  but with an extra parameter will be
named  factors' . The apostrophe has the drawback that it's easy to
forget, so some people now name such auxiliary functions  go  instead.

I think having a local function 'go' in 'factors' is aboslutely plausible: it is local, there's no ambiguity.
 
Regards,
Sergey