Determining primality by removing select composits
You should use more Data.List functions - explicit recursion is hard to read.

comp1 y = sort [ m
  | (i,n) &lt;- zip [0..149] n7sl
  , m &lt;- takeWhile ((&lt;= 11 * last (take y n7sl))) $ map (n*) $ drop i $ take n n7sl
  ]


Edit: Not sure whether my version fails to be equal to your original one, but here's a further refactoring of the one in your comment to get rid of some number manipulation. The takeWhile reflects the short-circuiting behavior of the original, explicitly recursive implementation, which uses that bs is ascending.

t = sort [ m | bs@(a:_) &lt;- tails n7s,
  m &lt;- takeWhile (&lt;= 11*last n7s) $ map (a*) bs]