Определить форму как имя функции?
Я хотел бы знать, что этот код означает на схеме:
(define ((K x) y) x)
(define (((S x) y) z)
((x z) (y z)))
Весь файл здесь.
Это правовая схема? Является ли (K x) параметризованной функцией, что-то вроде универсальных функций в Java? Я посмотрел ссылку на схему MIT, похоже, ничего не сказано для определения такого рода.
2 ответа
Попытка в MIT Схема работает
(define ((K x) y) x)
;Value: k
((k 3) 4)
;Value: 3
По-видимому, это определения K
а также S
комбинаторы из комбинаторного логического исчисления СКИ.
Мы можем определить ту же функцию явно,
(define k (lambda (x) (lambda (y) x)))
;Value: k
((k 3) 4)
;Value: 3
По-видимому, MIT-Scheme делает это для нас, так же как и в случае регулярных определений, таких как (define (fun foo) bar)
переводится на (define fun (lambda (foo) bar))
,
S
комбинатор будет определен явно как
(define S (lambda (x) (lambda (y) (lambda (z)
((x z) (y z))))))
(define ((add a) b) (+ a b))
;Value: add
(define (add1 a) (+ a 1))
;Value: add1
(((s add) add1) 3)
;Value: 7
Вот как работают языки каррирования (например, Haskell), где каждая функция является функцией одного аргумента. В этом отношении Haskell очень близок к комбинаторной логике, здесь вообще не используются круглые скобки, и мы можем написать те же определения просто
_K x y = x
_S x y z = x z (y z)
Чтобы _S (+) (1+) 3
производит 7
,