2016-10-02 1 views
-2
(define (comp f g) 
    (lambda (x)(f (g x)))) 

(define (complement f) (cond ((equal? (comp f (lambda (g) g)) #t) #f) 
          ((equal? (comp f (lambda (g) g)) #f) #t))) 

((complement odd?)2) 

계속해서 ((complement odd?) 2)는 프로 시저가 아닙니다. 나는 그것을 고치는 법을 모르겠다."절차가 아님"오류를 찾는 방법

+0

'보완'을 구현 한 것이 엉망입니다. 그것은 단지 논쟁으로'not'을 구성 할 필요가 있습니다. 보완은 절차를 반환해야합니다.나는 'cond'가'# f','# t' 그리고 빠진'else' 절에 대해 정의되지 않은 값을 반환하는 것을 볼 수 있으며 그 중 아무 것도 프로 시저가 아니므로 적용하려고하면 "프로 시저가 아닙니다" 결과. – Sylwester

+0

어떻게 해결할 수 있습니까? – siri

+0

단지'comp'를 사용하여'cond'를 갖는 것으로부터'complement'를 변경합니다. '(odd? x)'의 보수는'(not (odd? x))'이므로'((comp to odd?) x)'입니다. – Sylwester

답변

0

당신이 ((complement odd?) 2)이 정의에 빨간색 것을 볼 수 있습니다이 코드를 실행하면 다음과 같은 오류를 얻을 때 :

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #<void> 

은 그래서 의미 (complement odd?)는 절차하지만 값 #<void>을 반환하지 않습니다.

(complement odd?) 
; ==> nothing (aka #<void>) 

당신이 정말 어딘가에 사용을 참조하십시오 : 것을 시도하자

(list (complement odd?)) 
; ==> (#<void>) now you see it 

당신이 complementcond에서 모든 가능한 수표를 취급하지 않는 내가 왜 볼 것을 의미한다 .. comp을 사용해 보셨습니까?

(comp f (lambda (g) g)) ; ==> #<procedure> 

분명히 comp의 사용이 절차가됩니다. 본문에는 반환이 절차임을 나타내는 람다 형식이 있으므로 이상하지 않습니다. 결코 없을 것입니다 #t 또는 #felse (기본값) 조건이 true가 아닐 때를 나타냅니다. cond은 구현 관련 defauls 값을 반환합니다. Racket에서는 #<void>이 REPL에 의해 압도되어 있지만 다른 구현에서는 banana이거나 구현자가 원하는대로 항상 else 절이 있어야합니다. 필요하다고 생각하지 않는다면 (else (error "should never happen"))을 수행하면됩니다. (시도해보십시오)

cond의 결과는 #t#f입니다. 당신이 프로 시저로 결과를 사용하고 있기 때문에 오류가 될 것이다 절차 아닌 수익의 smething 각 장소를

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #t 

: 그것은 당신의 코드가 일한 sould 경우이 오류 대신 메시지를 가지고 것을 의미 . 항상 프로 시저를 리턴하도록 구현을 변경해야합니다.

그래서 "not a procedure"오류를 찾는 방법에 대한 대답입니다. 프로 시저를 수정하는 방법에 대한 대답은 아니지만이 프로 시저가 전 세계에서 가장 간단한 프로 시저이므로 추가 할 것입니다. 프로 시저 comp을 사용하면 두 개의 프로 시저를 사용하여 두 프로 시저를 반환합니다. 예. add2를 원하면 (define add2 (comp add1 add1)) 수 있습니다. complement은 허위 값 #f#t으로 바뀌고 모든 참 값은 #f으로 바뀌어야합니다. not이 너무 notodd?의 구성이 작동 절차가 될 않습니다 같은 even?로 :

(define (complement f) 
    (comp not f)) ; comp returns a procedure always 

(define my-even? (complement odd?)) 
(my-even? 2) ; ==> #t 

우리는 당신이 무엇을 확인하는 대체 방법을 사용할 수 있습니다 아무것도 변이하지 않기 때문에 :

(my-even? 2)      ; ==> 
((comp not odd?) 2)    ; ==> 
(((lambda (x) (not (odd? x))) 2) ; ==> 
(not (odd? 2))     ; ==> 
(not #f)       ; ==> 
#t 
관련 문제