Function 在scheme中使用布尔函数

Function 在scheme中使用布尔函数,function,scheme,boolean,Function,Scheme,Boolean,我想使用“eq”、“null”等“member”函数。但是,我不知道如何修复它 (define (member atm lst) (cond ((null? lst) #F) ((eq? atm (car lst)) #T) (else (member atm (cdr lst))) ) ) 我曾经在哪里 (define (duplicate-entries lst) (cond ((null? lst)

我想使用“eq”、“null”等“member”函数。但是,我不知道如何修复它

(define (member atm lst)
    (cond
        ((null? lst) #F)
        ((eq? atm (car lst)) #T)
        (else (member atm (cdr lst)))
    )
)
我曾经在哪里

(define (duplicate-entries lst)
    (cond
        ((null? lst) #F)
        ((member? (car lst) (cdr lst))) #T)
        (else duplicate-entries (cdr lst))
    )
)

member?
不起作用,我如何修复它?

您已经定义了
member
函数,而您正在使用
member?
。将
member
定义为
member?
(定义(member?atm lst)…)
让我们依次看看每个过程,首先是
member
。请注意,Scheme中已经有一个标准函数,因此用相同的名称定义一个新过程是个坏主意。以下是现有的
成员
过程的功能:

成员
找到与
相等的lst的第一个元素
v
。如果存在这样的元素,则返回以该元素开头的lst的尾部。否则,结果为
#f

上述过程使用
equal?
进行测试,并返回与预期不同的值。稍微接近预期程序,我们有标准功能:

memq
类似于成员,但使用eq?查找元素

但是,返回的值不是您期望的值。我建议您这样定义您的过程,注意我们使用的是
memq
,根据惯例,名称以
结尾,表示这是一个布尔过程:

(define (member? atm lst)
  (if (memq atm lst) #t #f))
现在让我们看一下重复的条目。有几个括号问题(正确缩进代码会显示这一点),成员资格过程的名称也有问题(您的过程称为
member
,但您将其作为
成员?
调用)。您可以使用上面定义的
成员?
或使用
memq
,这两种方法在这种情况下都可以正常工作,因为
memq
将在找到元素时返回非假值,这将使条件为真:

(define (duplicate-entries lst)
  (cond ((null? lst) #f)
        ((member? (car lst) (cdr lst)) #t)
        (else (duplicate-entries (cdr lst)))))
或者,这是推荐的方法-如果现有程序满足您的需要,则无需重新发明轮子:

(define (duplicate-entries lst)
  (cond ((null? lst) #f)
        ((memq (car lst) (cdr lst)) #t)
        (else (duplicate-entries (cdr lst)))))

嗯,这只是因为
member?
是一个未绑定的变量,您没有定义它!您定义了
成员
。顺便说一下,您实际上是在谈论
memq
-函数,它是任何R5RS兼容实现的一部分。此外,还有一些其他缺陷:
重复条目
缺少括号,其意图不太清楚。请根据方案约定缩进代码-注意,右括号应保留在同一行中,而不是像其他语言中使用大括号时一样保留在不同的行中。布尔值是用小写字母写的:
#t,#f
这是对的,但根据scheme的语义,问号是错误的,因为OP的函数不一定返回布尔值(另请参见我上面的注释和R5RS)。@LudwigMeier:我认为member的OP实现只有布尔返回值。。不是吗?对不起,你当然是对的。在测试时,我一定是把它和
member
-函数中的buildt搞砸了,它实际上没有返回布尔值。所以我的第一句话是胡说八道。