code_junkie

Implement zip using foldr

Nov 11th, 2011
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. myFoldl :: (a -> b -> a) -> a -> [b] -> a
  2.  
  3. myFoldl f z xs = foldr step id xs z
  4. where step x g a = g (f a x)
  5.  
  6. zip2 xs ys = foldr step done xs ys
  7. where done ys = []
  8. step x zipsfn [] = []
  9. step x zipsfn (y:ys) = (x, y) : (zipsfn ys)
  10.  
  11. zip2 xs ys = foldr step done xs ys
  12.  
  13. zip2 = foldr step done
  14.  
  15. myzip = foldr step (const []) :: [a] -> [b] -> [(a,b)]
  16. where step a f (b:bs) = (a,b):(f bs)
  17. step a f [] = []
  18.  
  19. > (define (zip lista listb)
  20. ((foldr (lambda (el func)
  21. (lambda (a)
  22. (if (empty? a)
  23. empty
  24. (cons (cons el (first a)) (func (rest a))))))
  25. (lambda (a) empty)
  26. lista) listb))
  27. > (zip '(1 2 3 4) '(5 6 7 8))
  28. (list (cons 1 5) (cons 2 6) (cons 3 7) (cons 4 8))
  29.  
  30. el->3, func->(lambda (a) empty)
  31.  
  32. (lambda (a) (cons (cons el (first a)) (func (rest a))))
  33. (lambda (a) (cons (cons 3 (first a)) ((lambda (a) empty) (rest a))))
  34.  
  35. > (define f (lambda (a) (cons (cons 3 (first a)) ((lambda (a) empty) (rest a)))))
  36. > (f (list 9))
  37. (list (cons 3 9))
  38.  
  39. el->3, func->f ;using f for shorthand
  40. (lambda (a) (cons (cons el (first a)) (func (rest a))))
  41. (lambda (a) (cons (cons 2 (first a)) (f (rest a))))
  42.  
  43. > (define g (lambda (a) (cons (cons 2 (first a)) (f (rest a)))))
  44. > (g (list 9 1))
  45. (list (cons 2 9) (cons 3 1))
  46.  
  47. (lambda (a) (cons (cons 2 (first a)) (f (rest a))))
  48.  
  49. (cons (cons 2 (first (list 9 1))) (f (rest (list 9 1))))
  50. (cons (cons 2 9) (f (list 1)))
Add Comment
Please, Sign In to add comment