Определить форму как имя функции?

Я хотел бы знать, что этот код означает на схеме:

(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,

Это называется Curried Function Shorthand и описано здесь.

Другие вопросы по тегам