-- http://stackoverflow.com/a/29880293/849891 {- zipw :: [a] -> [a] -> [a] zipw xs ys = (zipper xs) (zipper ys) where zipper xs q = foldr (\ x r q -> x : q r) (const []) xs q --- c -------------- --- n ---- -- zipper [x1,x2,x3] (zipper ys) = -- c x1 (c x2 (c x3 n)) (zipper ys) --- r -------- --- q ----- tr ~ tq ; q r :: [a] -- => r :: tq -> [a] -- tr ~ tr -> [a] <<------<< -} newtype TR a = Pack { unpack :: TR a -> [a] } -- !!!!!! <<------<< zipw :: [a] -> [a] -> [a] zipw xs ys = unpack (zipper xs) (zipper ys) where zipper :: [a] -> TR a zipper = foldr (\ x r -> Pack $ \q -> x : unpack q r) (Pack $ const []) main1 = print . take 6 $ zipw [1..] [10,20..] -- [1,10,2,20,3,30] -- http://stackoverflow.com/q/29885983/849891 {- zipp :: [a] -> [b] -> [(a,b)] zipp xs ys = zip1 xs (zip2 ys) where -- zip1 :: [a] -> tq -> [(a,b)] -- zip1 xs :: tr ~ tq -> [(a,b)] zip1 xs q = foldr (\ x r q -> q x r ) n xs q -------- c -------- n q = [] -- zip2 :: [b] -> a -> tr -> [(a,b)] -- zip2 ys :: tq ~ a -> tr -> [(a,b)] zip2 ys x r = foldr (\ y q x r -> (x,y) : r q ) m ys x r ---------- k -------------- m x r = [] -} -- tr ~ tq -> [(a,b)] -- tq ~ a -> tr -> [(a,b)] newtype Tr a b = PackR { unpackR :: Tq a b -> [(a,b)] } newtype Tq a b = PackQ { unpackQ :: a -> Tr a b -> [(a,b)] } main = print $ zipp [1..] [10,20,30] -- [(1,10),(2,20),(3,30)] zipp :: [a] -> [b] -> [(a,b)] zipp xs ys = unpackR (zip1 xs) (zip2 ys) where -- zip1 :: [a] -> Tr a b zip1 = foldr (\ x r -> PackR $ \q -> unpackQ q x r ) n n = PackR (\_ -> []) -- zip2 :: [b] -> Tq a b zip2 = foldr (\ y q -> PackQ $ \x r -> (x,y) : unpackR r q ) m m = PackQ (\_ _ -> [])