fork(1) download
  1. -- http://stackoverflow.com/a/29880293/849891
  2.  
  3. {-
  4. zipw :: [a] -> [a] -> [a]
  5. zipw xs ys = (zipper xs) (zipper ys) where
  6.   zipper xs q = foldr (\ x r q -> x : q r) (const []) xs q
  7.   --- c -------------- --- n ----
  8.  -- zipper [x1,x2,x3] (zipper ys) =
  9.  -- c x1 (c x2 (c x3 n)) (zipper ys)
  10.   --- r -------- --- q ----- tr ~ tq ; q r :: [a]
  11.   -- => r :: tq -> [a]
  12.   -- tr ~ tr -> [a] <<------<<
  13. -}
  14. newtype TR a = Pack { unpack :: TR a -> [a] } -- !!!!!! <<------<<
  15.  
  16. zipw :: [a] -> [a] -> [a]
  17. zipw xs ys = unpack (zipper xs) (zipper ys) where
  18. zipper :: [a] -> TR a
  19. zipper = foldr (\ x r -> Pack $ \q -> x : unpack q r)
  20. (Pack $ const [])
  21.  
  22. main1 = print . take 6 $ zipw [1..] [10,20..]
  23. -- [1,10,2,20,3,30]
  24.  
  25. -- http://stackoverflow.com/q/29885983/849891
  26. {-
  27. zipp :: [a] -> [b] -> [(a,b)]
  28. zipp xs ys = zip1 xs (zip2 ys)
  29.   where
  30.   -- zip1 :: [a] -> tq -> [(a,b)] -- zip1 xs :: tr ~ tq -> [(a,b)]
  31.   zip1 xs q = foldr (\ x r q -> q x r ) n xs q
  32.   -------- c --------
  33.   n q = []
  34.  
  35.   -- zip2 :: [b] -> a -> tr -> [(a,b)] -- zip2 ys :: tq ~ a -> tr -> [(a,b)]
  36.   zip2 ys x r = foldr (\ y q x r -> (x,y) : r q ) m ys x r
  37.   ---------- k --------------
  38.   m x r = []
  39. -}
  40.  
  41. -- tr ~ tq -> [(a,b)]
  42. -- tq ~ a -> tr -> [(a,b)]
  43.  
  44. newtype Tr a b = PackR { unpackR :: Tq a b -> [(a,b)] }
  45. newtype Tq a b = PackQ { unpackQ :: a -> Tr a b -> [(a,b)] }
  46.  
  47. main = print $ zipp [1..] [10,20,30]
  48. -- [(1,10),(2,20),(3,30)]
  49.  
  50. zipp :: [a] -> [b] -> [(a,b)]
  51. zipp xs ys = unpackR (zip1 xs) (zip2 ys)
  52. where
  53. -- zip1 :: [a] -> Tr a b
  54. zip1 = foldr (\ x r -> PackR $ \q -> unpackQ q x r ) n
  55. n = PackR (\_ -> [])
  56.  
  57. -- zip2 :: [b] -> Tq a b
  58. zip2 = foldr (\ y q -> PackQ $ \x r -> (x,y) : unpackR r q ) m
  59. m = PackQ (\_ _ -> [])
Success #stdin #stdout 0s 4656KB
stdin
Standard input is empty
stdout
Standard output is empty