遍历 Racket 中的结构列表列表?

iterate through a list of lists of strucs in Racket?

给定以下形式的列表:

(define lst (list
    (list
    (make-route-section 32 'ordinary-road 23 0.45)
    (make-route-section 54 'ordinary-road 92 0.83)
    (make-route-section 14 'street 8 0.82)
    (make-route-section 44 'ferry 34 0.64)
    (make-route-section 96 'ferry 249 0.41)
    )(
    list
    (make-route-section 92 'ordinary-road 12 0.44)
    (make-route-section 98 'highway 45.243 0.3)
    (make-route-section 44 'ordinary-road 34.4 0.64)
    (make-route-section 39 'street 6 0.8)
    )(
    list
    (make-route-section 62 'highway 82 0.35)
    (make-route-section 58 'street 4 0.46)
    (make-route-section 50 'highway 81 0.24)
    (make-route-section 75 'highway 67.3 0.39)
    )
    )

路段如下:

    (define-struct route-section (id kind length eco-index))
    (define-struct traffic-jam (section-id delay))

例如,我将如何使用 (list 32 62) 之类的列表过滤掉具有给定 ID(结构的第一个字段)的某些结构,它会 return 我是外部列表的第二个元素.让我特别困惑的是,当我输入 (second lst) 时,它 return 编辑了整个列表的第一个列表的第二个元素。

如何计算路段的长度?我觉得很蠢,即使使用高阶函数我也无法遍历嵌套列表。

下面是计算路线长度的方法。

一条路线是路段的列表,每个路段是路段的列表,路段是结构。

要对数字列表求和,一个好的方法是 (foldl + 0 <list>)。但是我们没有数字列表,我们有段列表。所以我们想从每个段中得到一个数字。我们可以再次使用 foldl。但是该段的每个元素都不是一个数字:它是一个部分。因此,获取某物列表和获取某物列表的一个好方法是使用 (map <function-to-turn-something-into-something-else> <list-of-somethings>).

route-section-length 将采用一个 section 对象和 return 它的长度,所以这就是我们要映射的函数。所以我们可以开始,在一个片段上,把它变成一个片段长度的列表:

(map route-section-length <segment>)

现在我们有每个段的数字列表,我们可以使用 foldl:

(foldl + 0 (map route-section-length <segment>))

这会将一个段变成一个数字。嗯,我们有一个段列表,所以我们想把它们变成一个数字列表,我们可以通过映射一个函数来实现,该函数的主体是上面的表达式:

(map (λ (segment)
         (foldl + 0 (map route-section-length segment)))
       route)

好的,这给了我们一个数字列表,我们现在需要将其加起来,再次使用 foldl:

(foldl + 0
         (map (λ (segment)
                (foldl + 0 (map route-section-lenght segment)))
              route))

我们想要的是包含在定义中的内容。


另外:正确缩进代码