Functional programming 方案映射函数

Functional programming 方案映射函数,functional-programming,scheme,Functional Programming,Scheme,我正在尝试使用Map/Foldl/Foldr查找列表的长度 (define (suml lst) (length lst)) Input : (suml '(1 2 3)) Output : 3 Input : (suml '(((((2)))) (1))) Output: 2 如何使用foldl/map/foldr修改它?正如在评论中提到的,map采用函数并以元素方式应用它。使用map的函数将创建相同长度的列表。为了创建长度函数,我们将列表压缩为单个值。这就是折叠的目的 (定义(长度l) (

我正在尝试使用Map/Foldl/Foldr查找列表的长度

(define (suml lst)
(length lst))
Input : (suml '(1 2 3))
Output : 3
Input : (suml '(((((2)))) (1)))
Output: 2

如何使用foldl/map/foldr修改它?

正如在评论中提到的,map采用函数并以元素方式应用它。使用map的函数将创建相同长度的列表。为了创建长度函数,我们将列表压缩为单个值。这就是折叠的目的

(定义(长度l)
(foldr(λ(cur长度)(+1 cur长度))0 l))

当您考虑foldr时,您应该考虑将列表中的cons替换为函数,将空列表替换为基本case参数。以以下为例:

”(1234)
=(cons 1(cons 2)(cons 3(cons 4’((()))))
(foldr f base'(1 2 3 4))
=(f1(f2(f3(f4基)))

事实证明,foldl在这种情况下也有效,因为我们只是为每个元素添加一个元素,不管我们是从左向右还是从右向左

(定义(长度l)

(foldl(λ(cur长度)(+1 cur长度))0 l))

如注释中所述,map采用一个函数并按元素应用它。使用map的函数将创建相同长度的列表。为了创建长度函数,我们将列表压缩为单个值。这就是折叠的目的

(定义(长度l)
(foldr(λ(cur长度)(+1 cur长度))0 l))

当您考虑foldr时,您应该考虑将列表中的cons替换为函数,将空列表替换为基本case参数。以以下为例:

”(1234)
=(cons 1(cons 2)(cons 3(cons 4’((()))))
(foldr f base'(1 2 3 4))
=(f1(f2(f3(f4基)))

事实证明,foldl在这种情况下也有效,因为我们只是为每个元素添加一个元素,不管我们是从左向右还是从右向左

(定义(长度l)

(foldl(lambda(cur length)(+1 cur length))0 l))

使用
map
无法找到列表的长度,因为
map
将函数应用于列表的每个元素,但要知道长度,需要了解整个列表的信息。不过,您的代码有点傻,因为
length
已经是一个获取列表长度的函数。只需放下
映射
并使用
(length lst)
(此时,您可以放下
suml
包装,因为它只是
长度
)。或者你真的在尝试做其他事情?函数应该如何工作。你能给出示例输入和预期结果吗?我更新了OP,请勾选:)Sylwester Alexis King你无法使用
map
找到列表的长度,因为
map
将函数应用于列表的每个元素,但知道长度需要了解整个列表的信息。不过,您的代码有点傻,因为
length
已经是一个获取列表长度的函数。只需放下
映射
并使用
(length lst)
(此时,您可以放下
suml
包装,因为它只是
长度
)。或者你真的在尝试做其他事情?函数应该如何工作。你能给出示例输入和预期结果吗?我更新了OP,请检查:)Sylvester Alexis King