Question

I am learning a course of Scheme and have to do the following task. I have to write a function that gets two lists A and B in the same length and returns one list that every item inside is a list of two items - one from A and second from B.
For example the function gets '( 1 2 3) and '(4 5 6) and returns '((1 4)(2 5)(3 6)). I can do that using map like this:

(define (func lst1 lst2) (map (lambda(x y) (list x y)) lst1 lst2))

But the the question is to do that by foldr and without explicit recursion.

Can anyone please help me? I have no idea how to do that....
Thanks!

Was it helpful?

Solution

The trick is knowing what to pass as a function parameter, here's how:

(define (func l1 l2)
  (foldr (lambda (e1 e2 acc)
           (cons (list e1 e2) acc))
         '()
         l1 l2))

Notice that we're passing two lists at the end of foldr, so the lambda expects three parameters: the current element from the first list (e1), the current element from the second list (e2) and the accumulated output (acc), which starts with value '(). The rest is easy, just build the output along using cons and list. It works as expected:

(func '(1 2 3) '(4 5 6))
=> '((1 4) (2 5) (3 6))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top