- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一般来说,我是 Scheme 和函数式编程的新手。谁能解释一下这段代码——具体是什么 kons
和 knil
是?目标是展平列表列表。
(define (fold1 kons knil lst)
(if (null? lst)
knil
(fold1 kons (kons (car lst) knil) (cdr lst))))
kons
是一个函数,因为它被应用于两个参数,但仍然不能完全确定它的功能。
最佳答案
这是一个(奇怪的)折叠
这是一个通用的折叠程序。在 Lisps 中,列表由 cons 单元格和空列表表示,其中每个(正确的)列表是空列表 ()
, 或一个 cons 单元格,其 car
是列表的一个元素,其 cdr
是列表的其余部分。例如,列表 (1 2 3 4 5)
可以由
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 '())))))
fold1
您展示的功能:
(define (fold1 kons knil lst)
(if (null? lst)
knil
(fold1 kons (kons (car lst) knil) (cdr lst))))
(kons 5 (kons 4 (kons 3 (kons 2 (kons 1 knil)))))
0
如
knil
和
+
如
kons
,您计算列表中元素的总和。
(kons (kons (kons (kons (kons knil 1) 2) 3) 4) 5)
+
查看时可能会更清晰和中缀符号:
(((((0 + 1) + 2) + 3) + 4) + 5)
(1 + (2 + (3 + (4 + (5 + 0)))))
(kons knil 1)
可以先评估以产生一些值
v
,然后在同一个堆栈空间中,
(kons v 2)
可以评估,等等。右关联方法需要先遍历到列表的末尾。一个简单的实现需要与列表长度成比例的堆栈空间。
fold1
有点困惑,因为它以左关联方式处理列表的元素,但是组合函数的参数顺序是相反的。
cons
来生成一个新值。具有组合功能和具有某些指定值的空列表。
((a b) (c d) (e f))
, 它由
(cons '(a b) (cons '(c d) (cons '(e f) '())))
(append '(a b) (append '(c d) (append '(e f) '())))
append
对于
kons
, 和
'()
对于
knil
.但是,在这个稍微混杂的折叠中,您的结构将是
(kons '(e f) (kons '(c d) (kons '(a b) knil)))
knil
仍可
'()
, 但是
kons
将需要是调用
append
的函数,但交换参数顺序:
(define (flatten lists)
(fold1 (lambda (right left)
(append left right))
'()
lists))
(flatten '((a b) (c d) (e f)))
;=> (a b c d e f)
fold
在练习中,我希望列表的列表只嵌套一层。然而,既然我们已经看到了如何实现一个简单的
flatten
(define (flatten lists)
(fold1 (lambda (right left)
(append left right))
'()
lists))
kons
现在起作用
(lambda (right left)
(append left right))
left
是我们一直在建立的已经附加和扁平化的列表。
right
是我们现在正在采用的新组件。如果我们调用
flatten
这也应该使任意嵌套列表变平:
(define (flatten lists)
(fold1 (lambda (right left)
(append left (flatten right))) ; recursively flatten sublists
'()
lists))
(flatten '((a b) (c d)))
, 我们最终会调用
(flatten '(a b))
,然后会调用
(flatten 'a)
, 但是
flatten
是
fold1
的包装器, 和
fold1
期望它的参数是列表。我们需要决定在
flatten
时要做什么用非列表调用。一个简单的方法是让它返回一个包含非列表参数的列表。该返回值将与接收该值的附加很好地结合。
(define (flatten lists) ; lists is not necessarily a list of lists anymore,
(if (not (pair? lists)) ; perhaps a better name should be chosen
(list lists)
(fold1 (lambda (right left)
(append left (flatten right)))
'()
lists)))
(flatten '(a (b (c)) (((d)))))
;=> (a b c d)
关于functional-programming - 展平列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229444/
您好,我有一个使用 JSON.Stringify 输出到此的对象 {"0":["test1","ttttt","","","","","","","",""],"1":["test2","ghjgjh
我有以下数据框,它是执行 groupby + 聚合总和的结果: df.groupby(['id', 'category']).agg([pd.Series.sum])
我有一个 3D 三角形带(见插图)。三角形不在一个平面内。 我想展平三角形带,使所有三角形都位于第一个三角形的平面内。 计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内
简单地说,我正在寻找可在 iOS 上使用的与 NSBezierPath 的 -bezierPathByFlatteningPath 等效的方法。这对我来说是直接处理 CGPath 的函数还是 UIBe
假设我有以下 JToken: @"{ ""data"": [ { ""company"": { ""ID"": ""12
如果我在多个分支中处理单个功能,我会使用 git pull branch1 branch2 branch3 将所有更改 pull 入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁
这个问题在这里已经有了答案: How do I make a flat list out of a list of lists? (33 个答案) 关闭6年前。 假设我们有一个返回列表(或有限迭代器)
给定如下模式: root |-- first_name: string |-- last_name: string |-- degrees: array | |-- element: struc
我有一个包含多个列的表,其中一些列是相同长度的数组。我想解除它们的嵌套,以获得包含来自不同行中的数组的值的结果。 所以有这样一张 table : 我想去: 这是其中一个数组列的工作方式: WITH d
我最近买了一台 RICOH THETA S,用于在 360 vr 中录制足球比赛。 我想使用 ffmpeg 将我用我的相机录制的鱼眼电影展平,这可能吗? enter image description
这是我的 question 的后续.是否可以将表格展平为如下所示,而不是数据透视表: data = {'year': ['2016', '2016', '2015', '2014', '2013'],
我目前正在将我的 jruby/java2d 图形绘制/布局应用程序移植到 macruby/cocoa。因此我需要获取开放的 NSBezierPath 与封闭的 NSBezierPath 的交点。 在
是否有一种简单的方法来展平一组 try 以给出尝试值的成功或失败? 例如: def map(l:List[Int]) = l map { case 4 => Failure(new Excepti
我有一个包含数百万行的“服务”表。每行对应于工作人员在给定日期和时间间隔内提供的服务(每行都有一个唯一的 ID)。在某些情况下,工作人员可能会在重叠的时间范围内提供服务。我需要编写一个查询来合并重叠的
我在使用Elastic Search(ES)检索JSON对象时遇到问题。现在,当我尝试使用下面的请求正文从ES查询一些数据时, "_source": [ "data.id", "dat
我有一个订单流(来源是订单列表)。每个订单都有一个 Customer 和一个 OrderLine 列表。 我想要实现的是拥有一个以客户为键的 map ,以及属于该客户的所有订单行,在一个简单的列表中作
给定一个如下所示的复杂对象: case class Complex ( id: Long, name: String, nested: Seq[Complex] ) 实际上,这可能会变成这
我很好奇你如何将数组 Promise 映射的结果展平。我有一个函数 Promise.maps 一组值,它们本身就是 promise (需要解析)并返回一个数组。所以,我得到类似的结果: [ [1, 2
我是 CouchDB 的新手,我只是想评估它在常见任务中的实用性。其中一项任务是生成报告。我的问题是:如果我有这样的文档结构: { "_id": "29763f342ab34fd7b579fd4
假设我们有这样的 map : %{"a": %{"b": 2, "c":5}, "d": 1} 有没有类似this function的东西(js回答同一问题)内置elixr? 最终结果应该是: %{"
我是一名优秀的程序员,十分优秀!