import Data.Sequence as Seq ((|>), empty, viewl, ViewL (..), length, index, singleton) isPrime primes n = let factors = viewl primes inner EmptyL = True inner (factor :< others) = if n `mod` factor == 0 then False else isPrime others n in inner $ viewl primes nextPrime primes = let findPrime n = if isPrime primes n then n else findPrime (n + 1) in primes |> (findPrime $ primes `index` (Seq.length primes - 1) + 1) results = foldr (.) id (replicate 10000 nextPrime) (singleton 2) result = results `index` (Seq.length results - 1) main = putStr $ show result