在方案中使用布尔函数

时间:2013-01-03 11:01:22

标签: function scheme boolean

我想使用“成员”功能,如“eq”,“null”等。但是,我不知道如何修复它?

(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?不起作用,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您使用member定义了member?功能。将member定义为member?,即(define (member? atm lst) ... )

答案 1 :(得分:1)

让我们依次看一下每个程序,member。请注意,Scheme中已经有一个标准的member函数,因此定义一个具有相同名称的新过程是个坏主意。以下是现有member过程的作用:

  

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

上述过程使用equal?进行测试,并返回与您预期的值不同的值。有点接近预期的程序,我们有标准的memq函数:

  

memq喜欢成员,但是使用eq找到一个元素。

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

(define (member? atm lst)
  (if (memq atm lst) #t #f))

现在让我们看一下duplicate-entries。有几个括号问题(正确缩进代码会显示这个问题),并且会员程序的名称存在问题(您的过程称为member,但您将其调用为member? })。您可以使用我们上面定义的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)))))