在Scheme中,使用map、reduce或filter计算列表中的元素数

在Scheme中,使用map、reduce或filter计算列表中的元素数,scheme,racket,Scheme,Racket,(number-length'(11100))假设返回6。我知道如何使用长度并找到它,但我不知道如何在没有长度的情况下使用map、filter或reduce。有人能给出一些想法吗?映射并应用: (define (number-length1 lst) (apply + (map (lambda (n) 1) lst))) (define (number-length2 lst) (foldl (lambda (list-element n) (+ n 1)) 0

(number-length'(11100))假设返回6。我知道如何使用长度并找到它,但我不知道如何在没有长度的情况下使用map、filter或reduce。有人能给出一些想法吗?

映射并应用:

(define (number-length1 lst)
  (apply + (map (lambda (n) 1) lst)))
(define (number-length2 lst)
  (foldl (lambda (list-element n) (+ n 1))
         0
         lst))
(define (number-length3 lst)
  (foldl + 0 (map (lambda (n) 1) lst)))
Foldl/reduce:

(define (number-length1 lst)
  (apply + (map (lambda (n) 1) lst)))
(define (number-length2 lst)
  (foldl (lambda (list-element n) (+ n 1))
         0
         lst))
(define (number-length3 lst)
  (foldl + 0 (map (lambda (n) 1) lst)))
映射和折叠/减少:

(define (number-length1 lst)
  (apply + (map (lambda (n) 1) lst)))
(define (number-length2 lst)
  (foldl (lambda (list-element n) (+ n 1))
         0
         lst))
(define (number-length3 lst)
  (foldl + 0 (map (lambda (n) 1) lst)))

您编写了哪些代码并尝试使用这些选项?您当然可以单独使用
reduce
实现
length
,或者使用
map
reduce
,或者使用
map
apply
生成一个列表,保留结构而不是元素<代码>过滤器生成一个列表,保留元素但不保留结构<代码>减少生成您自己选择的值。考虑一下你需要哪个选项。因为这看起来像是家庭作业,OP提到的是
reduce
,而不是
foldl
,我想知道OP是不是要使用课程作业中定义的
reduce
。您需要注意折叠类过程的参数顺序。球拍
foldl
的工作原理如您所示,Guile Scheme
向左折叠
、SRFI-1
折叠
减少
也一样。但是R6RS方案
左折
的参数顺序相反(累加器排在第一位),MIT方案中的
左折
也是如此(最近被弃用;
左折
的行为与SRFI-1中的一样)。关键是,我们不知道OP
reduce
使用什么约定。@adabsurdum也很好,因为它让OP进行这些调整,而不仅仅是复制粘贴代码。:)@意志——的确如此;我只是希望答案可能会承认类似折叠的程序之间存在差异;)