2

这是一个家庭作业:

返回一个列表,其中包含给定列表中满足给定谓词的所有元素。例如,

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) 

应该返回 (3 2 4)。

我昨天才开始计划,所以我是一个完整的菜鸟。如果我正确理解此函数函数调用的语法,“过滤器”是函数,“(lambda(x)(< x 5)”是参数。这类似于java中的匿名函数吗?

编辑:

我从另一篇关于 stackoverflow 的帖子中找到了一些代码。他们直接回答了这个问题:这是他们写的:

   (define (my-filter pred lst)
     (cond ((null? lst) null)
       ((pred (first lst))
          (cons (first lst) (my-filter pred (rest lst))))
       (else (my-filter pred (rest lst)))))

这很好,而且有效,但在我使用它之前,我想了解它。“pred”是一个函数,但在这种情况下,它们将 (< x 5) 传递给它,并且它以某种方式接受了这个值。我不明白。

有人可以向我解释一下这个程序期间会发生什么吗?我不明白正在发生的事情背后的逻辑。

4

4 回答 4

5

其他答案很准确。另外,如果对你有帮助,这个程序的意思是一样的:

#lang racket

(define (less-than-five x) (< x 5))

(filter less-than-five '(3 9 5 8 2 4 7))

Scheme/Racket 和 Java 之间的主要区别在于

less-than-five

是一个值;在 Java 中,方法不是值。

编辑:我看到你在你的问题中添加了一堆。我印象深刻的是你有后续问题,而不是仅仅接受你所得到的:)

我认为回答这个问题的最好方法是关注当你进行函数调用时会发生什么,并使用......步进器!

哦,什么鬼。我制作了一个视频,并在 YouTube 上播放:

http://youtu.be/2hmamosiqGI

于 2012-04-27T01:43:20.407 回答
1

是的,您正在调用该filter函数,其参数之一是(lambda (x) (< x 5)). (还有另一个论点,你的数字列表。)是的,它很像一个匿名类,在 Java 中只有一个方法。

于 2012-04-27T01:26:35.113 回答
1

是的,lambda在方案中定义了一个函数。如果函数没有按名称分配给变量,那么它基本上与匿名函数相同。

于 2012-04-27T01:27:12.073 回答
0

下面是一个使用 Google 的 Guava 库的 Java 问题的简单示例:

Iterables.filter(asList(3,9,5,8,2,4,7), new Predicate<Integer>() {

    @Override
    public boolean apply(Integer a) {
        return a < 5;
    }

});

我提出它是为了表明 Java 没有匿名函数,而是匿名类。Java 没有作为第一类数据类型的功能。我提出这个问题是因为如果你参加一门课程(我想你是),这很可能会在考试中被问到。

于 2012-04-27T01:44:58.780 回答