Невозможно получить реализацию 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 комбинатора в "Маленьком интриганке".