--q103x.hs
--http://ideone.com/vfdapF
--infinite_product_process ::
infinite_product_process values [] = [(values, [])]
infinite_product_process values (x:xs) = [(values ++ [e], xs) | e <- x]
infinite_product [] = []
infinite_product xs =
let q = [infinite_product_process [] xs]
fn [] = []
fn (((vals,[]):[]):ys) = vals : (fn ys)
fn (((vals,[]):vs):ys) = vals : (fn (ys ++ [vs]))
fn (((vals,itrs):[]):ys) = fn (ys ++ [infinite_product_process vals itrs])
fn (((vals,itrs):vs):ys) = fn (ys ++ [infinite_product_process vals itrs] ++ [vs])
in fn q
primes =
let minus [] _ = []
minus xs [] = xs
minus (x:xs) (y:ys)
| x < y = x : minus xs (y:ys)
| x > y = minus (x:xs) ys
eratos (p:xs) = p : eratos (xs `minus` [p*p, (p+2)*p..])
in 2 : eratos [3, 5..]
nats = [1, 2..]
fibs = fib_gen 1 1 where
fib_gen a b = a : (fib_gen b (a+b))
join sep [] = ""
join sep
(x:xs
) = (show x
) ++ sep
++ (join sep xs
)
product_fibs_only = infinite_product [fibs]
product_nats_fibs = infinite_product [nats, fibs]
product_primes_nats_fibs = infinite_product [primes, nats, fibs]
product_nats_1_3 = infinite_product [nats, [1, 2, 3]]
product_1_3_nats = infinite_product [[1, 2, 3], nats]
main = do
putStrLn $ join
"," (infinite
_product
[[1, 2], [1, 2], [1, 2]]) putStrLn $ join
"," (infinite
_product
[[1, 2], [1, 2], [1, 2], [1, 2]])