(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)
它一直说((补充奇数?)2)不是一个程序。我不确定如何解决它。
答案 0 :(得分: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
这意味着您没有在cond
的{{1}}中处理所有可能的检查,我明白为什么..您尝试过complement
吗?
comp
使用(comp f (lambda (g) g)) ; ==> #<procedure>
肯定会成为一个程序。不奇怪,因为身体有一个lambda形式,表明返回将是一个过程。 永远不会是comp
或#t
当你的谓词都没有变为真时,你没有#f
(默认)术语{{ 1}}返回特定于实现的默认值。在Racket中,这是else
由REPL压制,但在其他实现中它可以是cond
或者实现者想要的任何东西,所以你应该总是有一个#<void>
子句。如果你认为自己不需要它,那就banana
,你就可以了。 (尝试一下)
else
的后果是(else (error "should never happen"))
和cond
。这意味着如果您的代码已经运行,您将收到此错误消息:
#t
对于每个地方,由于您将结果用作程序,因此返回的内容不是一个错误的过程。您需要更改实现,以便始终返回过程。
因此,这是如何找到“非程序”错误的答案。它不是如何修复程序的答案,但由于这是世界上最简单的程序,我将添加它。你有一个程序#f
,它需要两个程序并返回两者的组成。例如。如果你想要add2,你可以application: not a procedure;
expected a procedure that can be applied to arguments
given: #t
。 comp
必须是假值(define add2 (comp add1 add1))
变为complement
,而所有真值都会变为#f
。 #t
执行此操作,因此#f
和not
的合成将成为与not
相同的过程:
odd?
由于我们不会改变任何内容,您可以使用替换方法来检查它的作用:
even?