1

これがコードです(これもここにあります):

#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を使用しています。コードの何が問題になっていますか?

4

1 に答える 1

9

を括弧で囲む必要がありますlength:

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

同じ長いラムダ式を 2 回入力する代わりに、試すこともできます

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

"The Little Schemer" の Y コンビネータの説明も参照してください。

于 2012-08-12T19:21:10.443 に答える