首页 > 解决方案 > OCaml:如何遍历记录类型中的列表参数

问题描述

如果我有一个数据结构,例如

type cost = int

type 'a map = {
  cities : 'a list
  routes : ('a * 'a * cost) list
}

并说我有一个带有标题的函数,例如

let nearest_cities (m : 'a map) = ...

我想递归遍历路线列表,最好和最干净的方法是什么?我试图匹配记录,但是我不确定如何递归更新记录的参数

谢谢

标签: pattern-matchingocamlrecord

解决方案


您说要更新记录,但您定义的记录类型是不可变的。您不能更改此类记录的字段值。用函数式语言处理此问题的常用方法是创建具有所需新内容的新记录。

您说您想“遍历”列表,但这还不够具体,无法提供详细的建议。List模块中有各种遍历的函数: List.iter, List.map, List.fold_left, 等等。

例如,这是一个增加 type 值的所有成本的函数'a map

 let cost_incr map =
      { map with routes =
            List.map (fun (a, b, c) -> (a, b, c + 1)) map.routes
      }

(还要注意你需要;在记录类型中定义cities字段之后。)


推荐阅读