2012-04-27 34 views
2

这是一个家庭作业:方案,将lambda作为函数参数 - 需要帮助理解ARGS

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

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

应该返回(3 2 4)。

我昨天刚刚开始计划,所以我是一个完整的noob。如果我正确理解这个函数函数调用的语法,那么“filter”是函数,“(lambda(x)(< x 5)”是参数。这与java中的匿名函数类似吗?

编辑:

我发现了一些代码从计算器另一篇文章中他们只是直出回答了这个问题:这是他们写的东西:

(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)到它,它是如此莫名其妙地接受这个价值。我不明白。

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

+2

只是一个迂腐的笔记。 Java没有匿名函数。它有匿名类,通常用于模拟“lambda”。 – 2012-04-27 01:33:21

+0

历史记录:在2012年,Java没有匿名函数(也称为“闭包”)......但从Java 8(iirc)开始,它现在可以实现。 – 2017-07-11 07:46:54

回答

1

是的,你在调用filter函数,其中一个参数是(lambda (x) (< x 5))。 (还有另外一个参数,你的数字列表。)是的,它非常类似于Java中使用单一方法的匿名类。

1

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

5

其他答案是点亮的。此外,如果是对您有所帮助,这个计划意味着同一件事:

#lang racket 

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

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

计划/球拍和Java之间的关键区别就在这里是

less-than-five 

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

编辑:我看到你添加了一堆到你的问题。我印象深刻的是你有 后续问题,而不是仅仅考虑你得到了什么:)

我认为要回答这个最好的办法是把重点放在什么发生在你 进行函数调用,并使用步进机!

哦,到底是什么。我做了一个视频,并打了它在YouTube上:

http://youtu.be/2hmamosiqGI

+0

对不起,因为我是一个菜鸟,所以我无法获得格式化权利,所以我只是在回答中发布。 – FatAdama 2012-04-27 02:16:16

+0

我喜欢它,stackoverflow符合可汗学院 – gcbenison 2012-04-28 05:00:42

+0

感谢您的视频,这是非常有益的。 – 2017-07-10 16:40:22

0

下面是使用谷歌的番石榴库中的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不具备第一类数据类型的功能。我提出这个问题,因为如果你选择了一门课程(我认为你是这样的),那么很可能会在考试中提出这个问题。