• Source
    1. --q103x.hs
    2. --http://ideone.com/vfdapF
    3.  
    4. --infinite_product_process ::
    5. infinite_product_process values [] = [(values, [])]
    6. infinite_product_process values (x:xs) = [(values ++ [e], xs) | e <- x]
    7.  
    8. infinite_product [] = []
    9. infinite_product xs =
    10. let q = [infinite_product_process [] xs]
    11. fn [] = []
    12. fn (((vals,[]):[]):ys) = vals : (fn ys)
    13. fn (((vals,[]):vs):ys) = vals : (fn (ys ++ [vs]))
    14. fn (((vals,itrs):[]):ys) = fn (ys ++ [infinite_product_process vals itrs])
    15. fn (((vals,itrs):vs):ys) = fn (ys ++ [infinite_product_process vals itrs] ++ [vs])
    16. in fn q
    17.  
    18. primes =
    19. let minus [] _ = []
    20. minus xs [] = xs
    21. minus (x:xs) (y:ys)
    22. | x < y = x : minus xs (y:ys)
    23. | x > y = minus (x:xs) ys
    24. | otherwise = minus xs ys
    25. eratos (p:xs) = p : eratos (xs `minus` [p*p, (p+2)*p..])
    26. in 2 : eratos [3, 5..]
    27.  
    28. nats = [1, 2..]
    29.  
    30. fibs = fib_gen 1 1 where
    31. fib_gen a b = a : (fib_gen b (a+b))
    32.  
    33. join sep [] = ""
    34. join sep (x:[]) = show x
    35. join sep (x:xs) = (show x) ++ sep ++ (join sep xs)
    36.  
    37. product_fibs_only = infinite_product [fibs]
    38. product_nats_fibs = infinite_product [nats, fibs]
    39. product_primes_nats_fibs = infinite_product [primes, nats, fibs]
    40. product_nats_1_3 = infinite_product [nats, [1, 2, 3]]
    41. product_1_3_nats = infinite_product [[1, 2, 3], nats]
    42.  
    43. main = do
    44. putStrLn $ join "," (take 10 product_fibs_only)
    45. putStrLn $ join "," (take 21 product_nats_fibs)
    46. putStrLn $ join "," (take 35 product_primes_nats_fibs)
    47. putStrLn $ join "," (take 15 product_nats_1_3)
    48. putStrLn $ join "," (take 15 product_1_3_nats)
    49. putStrLn $ join "," (infinite_product [[1, 2], [1, 2], [1, 2]])
    50. putStrLn $ join "," (infinite_product [[1, 2], [1, 2], [1, 2], [1, 2]])
    51.