OCaml:如何遍历记录类型中的列表参数

问题描述

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

type cost = int

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

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

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

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

谢谢

解决方法

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

您说您想“遍历”列表,但这还不够具体,无法提供详细的建议。 List模块中具有用于各种遍历的功能:List.iterList.mapList.fold_left等。

作为示例,下面是一个函数,该函数增加类型'a map的值的所有开销:

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

(还请注意,在记录类型的;字段定义之后,您需要cities。)