DrRacket/Scheme中的Map,Filter,Foldr

Luk*_*eva 13 scheme functional-programming filter fold map-function

编程语言:Scheme/DrRacket

目前,我们打算过map,filterfoldr我的基本的计算机科学类.我知道这三个都可以用来创建抽象函数,但老实说我对三者之间的区别以及何时使用每个函数有点困惑.

任何人都在关心解释每个用途的含义以及它们的不同之处?不幸的是我的书不是很清楚.

Tik*_*vis 39

基本思想是所有这三种方法都是将一些功能应用于列表的所有元素.

Map可能是最简单的 - 您只需将函数应用于列表的每个元素.这基本上与其他语言中的for-each循环相同:

 (map (lambda (x) (+ x 1)) '(1 2 3))
   => (2 3 4)
Run Code Online (Sandbox Code Playgroud)

基本上,地图是这样的:(map f '(1 2 3))是一样的(list (f 1) (f 2) (f 3)).

过滤器也很简单:该功能就像一个仲裁器,决定是否保留每个号码.想象一下,一个非常挑食的食客经过一个菜单,抱怨他不会吃的东西;)

 (filter (lambda (x) (equal? x 1)) '(1 2 3))
   => (1)
Run Code Online (Sandbox Code Playgroud)

我认为折叠是最难理解的.更直观的名称将是"累积".我们的想法是,当您继续"结合"列表时.在日常使用中有一些功能实际上是折叠 - 总和是一个完美的例子.

 (foldr + 0 '(1 2 3)) 
   => 6
Run Code Online (Sandbox Code Playgroud)

您可以将折叠视为将函数放在列表中的每个元素之间:(foldr + 0 '(1 2 3))与...相同1 + 2 + 3 + 0.

折叠是特殊的,因为与其他两个不同,它通常返回一个标量值 - 这是列表的元素而不是列表本身.(这并非总是如此,但无论如何,现在想一想.)

请注意,我可能没有完整的代码的每个细节 - 我只使用过不同的,较旧的Scheme实现,所以我可能错过了一些Racket细节.