Невозможно получить реализацию Y комбинатора работает

Вот код ( также здесь):

#lang racket
(define poorY
  ((lambda length
    (lambda (ls)
      (cond
        [(null? ls) 0]
        [else (add1 ((length length) (cdr ls)))])))
  (lambda length
    (lambda (ls)
      (cond
        [(null? ls) 0]
        [else (add1 ((length length) (cdr ls)))])))))

Когда я запускаю это:

> (poorY '(9 7 8))
. . application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '(#<procedure>)
  arguments...:
   '(#<procedure>)

Скриншот выглядит так:

Я использую DrRacket в качестве репла. Что не так с кодом?

1 ответ

Там должны быть круглые скобки length:

(define poorY
  ((lambda (length)  ;; here
    (lambda (ls)
      (cond
        [(null? ls) 0]
        [else (add1 ((length length) (cdr ls)))])))
  (lambda (length)   ;; and here
    (lambda (ls)
  ......

Вместо того, чтобы набирать одно и то же длинное лямбда-выражение дважды, вы также можете попробовать

(define poorY
  ((lambda (f) (f f))
   (lambda (length)
     (lambda (ls)
       (cond
         [(null? ls) 0]
         [else (add1 ((length length) (cdr ls)))])))))

См. Также обсуждение Y комбинатора в "Маленьком интриганке".

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