Lazy computation of primes in Haskell
Not an answer to your questions, but a correction for your first, looping attempt for Q3:

Things get much easier if you initially have at least one prime number in your list. You could ensure this by a separate case in isPrime, but why not cheat a little bit, and add it directly?

primes = 2 : filter isPrime [3..]


Then you can use your solution for Q1 without much changes (I took the freedom to kill some parens etc):

isPrime :: Integer -&gt; Bool
isPrime v = let maxDiv = floor $ sqrt $ fromIntegral v
            in all ((/= 0).(v `rem`)) $ takeWhile (&lt;= maxDiv) primes


However, this is not the best way to generate a list of primes. Read the excellent paper http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf for details.

[Edit] 

I forgot to mention http://www.haskell.org/haskellwiki/Prime_numbers with many interesting techniques.