-- 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
)
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 (\_ _ -> [])
LS0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjk4ODAyOTMvODQ5ODkxCgp7LQp6aXB3IDo6IFthXSAtPiBbYV0gLT4gW2FdCnppcHcgeHMgeXMgPSAoemlwcGVyIHhzKSAoemlwcGVyIHlzKSB3aGVyZQogICAgemlwcGVyIHhzIHEgPSBmb2xkciAoXCB4IHIgcSAtPiB4IDogcSByKSAoY29uc3QgW10pIHhzIHEKICAgICAgICAgICAgICAgICAgICAgICAgLS0tIGMgLS0tLS0tLS0tLS0tLS0gLS0tIG4gLS0tLQogLS0gemlwcGVyIFt4MSx4Mix4M10gKHppcHBlciB5cykgPQogLS0gYyB4MSAoYyB4MiAoYyB4MyBuKSkgKHppcHBlciB5cykKICAgICAgIC0tLSByIC0tLS0tLS0tICAtLS0gcSAtLS0tLSAgdHIgfiB0cSA7IHEgciA6OiBbYV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gPT4gciA6OiB0cSAtPiBbYV0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICB0ciB+ICAgdHIgLT4gW2FdICAgICAgICAgPDwtLS0tLS08PAotfQpuZXd0eXBlIFRSIGEgPSBQYWNrIHsgdW5wYWNrIDo6IFRSIGEgLT4gW2FdIH0gICAgICAtLSAgISEhISEhIDw8LS0tLS0tPDwKCnppcHcgOjogW2FdIC0+IFthXSAtPiBbYV0KemlwdyB4cyB5cyA9IHVucGFjayAoemlwcGVyIHhzKSAoemlwcGVyIHlzKSB3aGVyZQogICAgemlwcGVyIDo6IFthXSAtPiBUUiBhCiAgICB6aXBwZXIgPSBmb2xkciAoXCB4IHIgLT4gUGFjayAkIFxxIC0+IHggOiB1bnBhY2sgcSByKQogICAgICAgICAgICAgICAgICAgKFBhY2sgJCBjb25zdCBbXSkKICAgICAgICAgICAgICAgICAgICAgICAgCm1haW4xID0gcHJpbnQgLiB0YWtlIDYgJCB6aXB3IFsxLi5dIFsxMCwyMC4uXQotLSBbMSwxMCwyLDIwLDMsMzBdCgotLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yOTg4NTk4My84NDk4OTEKey0KemlwcCA6OiBbYV0gLT4gW2JdIC0+IFsoYSxiKV0KemlwcCB4cyB5cyA9IHppcDEgeHMgKHppcDIgeXMpCiAgd2hlcmUKICAgICAtLSB6aXAxIDo6IFthXSAtPiB0cSAtPiBbKGEsYildICAgICAgICAgIC0tIHppcDEgeHMgOjogdHIgfiB0cSAtPiBbKGEsYildCiAgICAgemlwMSB4cyBxID0gZm9sZHIgKFwgeCByIHEgLT4gcSB4IHIgKSBuIHhzIHEgCiAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0gYyAtLS0tLS0tLQogICAgIG4gICAgcSAgPSBbXQoKICAgICAtLSB6aXAyIDo6IFtiXSAtPiBhIC0+IHRyIC0+IFsoYSxiKV0gICAgIC0tIHppcDIgeXMgOjogdHEgfiBhIC0+IHRyIC0+IFsoYSxiKV0KICAgICB6aXAyIHlzIHggciA9IGZvbGRyIChcIHkgcSB4IHIgLT4gKHgseSkgOiByIHEgKSBtIHlzIHggciAgCiAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tIGsgLS0tLS0tLS0tLS0tLS0KICAgICBtICB4IHIgID0gW10KLX0KCi0tIHRyIH4gdHEgLT4gWyhhLGIpXQotLSB0cSB+IGEgLT4gdHIgLT4gWyhhLGIpXQoKbmV3dHlwZSBUciBhIGIgPSBQYWNrUiB7IHVucGFja1IgOjogIFRxIGEgYiAtPiBbKGEsYildIH0KbmV3dHlwZSBUcSBhIGIgPSBQYWNrUSB7IHVucGFja1EgOjogIGEgLT4gVHIgYSBiIC0+IFsoYSxiKV0gfQoKbWFpbiA9IHByaW50ICQgemlwcCBbMS4uXSBbMTAsMjAsMzBdCi0tIFsoMSwxMCksKDIsMjApLCgzLDMwKV0KCnppcHAgOjogW2FdIC0+IFtiXSAtPiBbKGEsYildCnppcHAgeHMgeXMgPSB1bnBhY2tSICh6aXAxIHhzKSAoemlwMiB5cykKICB3aGVyZQogICAgIC0tIHppcDEgOjogW2FdIC0+IFRyIGEgYgogICAgIHppcDEgPSBmb2xkciAoXCB4IHIgLT4gUGFja1IgJCBccSAtPiB1bnBhY2tRIHEgeCByICkgbiAKICAgICBuID0gUGFja1IgKFxfIC0+IFtdKQoKICAgICAtLSB6aXAyIDo6IFtiXSAtPiBUcSBhIGIKICAgICB6aXAyID0gZm9sZHIgKFwgeSBxIC0+IFBhY2tRICQgXHggciAtPiAoeCx5KSA6IHVucGFja1IgciBxICkgbSAKICAgICBtID0gUGFja1EgKFxfIF8gLT4gW10p