Exercise2-3 <---> Exercise2-5

Exercise 2.4.

Here is an alternative procedural representation of pairs. For this representation, verify that (car (cons x y)) yields x for any objects x and y.

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

What is the corresponding definition of cdr? (Hint: To verify that this works, make use of the substitution model of section 1.1.5.)


Ru: Вот еще одно процедурное представление для пар. Проверьте для этого представления, что при любых двух объектах x и y (car (cons x y)) возвращает x.

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

Каково соответствующее определение cdr? (Подсказка: Чтобы проверить, что это работает, используйте подстановочную модель из раздела 1.1.5.)


Scheme solution:

Let's try to illustrate how (car (cons x y)) works using substitution model. Let x = 1, y = 2, so we evaluate (car (cons 1 2)):

  (car (cons 1 2))
= (car (lambda (m) (m 1 2)))
= ((lambda (m) (m 1 2)) (lambda (p q) p))
;; substitute lambda argument instead of m
= ((lambda (p q) p) 1 2)
;; substitute 1 and 2 instead of p and q
;; note that we return the first of two arguments in lambda - p, because we define 'car' now
;; for 'cdr' we should return 'q'
= 1

After this we can easily define cdr:

(define (cdr z)
  (z (lambda (p q) q)))


Haskell solution:

cons x y = \m -> m x y

car z = z (\p _ -> p)

cdr z = z (\_ q -> q)


OCaml solution:

let cons x y = fun m -> m x y

let car z = z (fun p _ -> p)

let cdr z = z (fun _ q -> q)


Oberon/Component Pascal solution:

Sorry, no Oberon solutions for this exercise, because of no lambdas in Oberon... :-(

Exercise2-3 <---> Exercise2-5


Comments


:) :)) :( ;) :\ |) X-( B) Markup

Exercise2-4 (last edited 2008-10-05 01:39:31 by FirstnameLastname)