03 martie 2010

Forme curry si uncurry in Scheme

In Scheme, functiile au forma curry (isi asteapta parametrii pe rand) sau uncurry (primeste toti parametrii odata)

In urmatorul exemplu, se realizeaza concatenarea a doua liste folosind functii recursive in forma curry si uncurry:

appendcurry.ss


(define l1 '(1 2 3))
(define l2 '(5 6 7))

(define appendc
(lambda (l1)
(lambda (l2)
( if (null? l1) l2
(cons (car l1) ((appendc (cdr l1)) l2 ) ) ) )
))

(display ((appendc l1) l2))


appenduncurry.ss

(define l1 '(1 2 3))
(define l2 '(5 6 7))

(define appendu
(lambda (l1 l2)
( if (null? l1) l2
(cons (car l1) (appendu (cdr l1) l2 ) ) ) )
)

(display (appendu l1 l2))


Trecerea de la curry la uncurry sau invers a unei functii se face astfel:

(define f (lambda(x y) (+ x y)))

; curry -> uncurry

(define uc
(lambda (f)
( lambda(x)
(lambda(y)
(f x y)
))))

(((uc f ) 2 )3)

(define g (lambda (x)
(lambda (y)
(+ x y))))

; uncurry -> curry

( define cu
(lambda (f)
(lambda (x y)
((f x) y))))

((cu g) 2 3)

Niciun comentariu: