OCaml:如何遍历记录类型中的列表参数
OCaml: How to traverse a list parameter in a record type
如果我有这样的数据结构
type cost = int
type 'a map = {
cities : 'a list
routes : ('a * 'a * cost) list
}
然后说我有一个带有 header 的函数,例如
let nearest_cities (m : 'a map) = ...
我想递归地遍历路由列表,最好和最干净的方法是什么?我尝试匹配记录,但是我不确定如何递归更新记录的参数
谢谢
你说你想更新记录,但是你定义的记录类型是不可变的。您无法更改此类记录的字段值。用函数式语言处理这个问题的通常方法是创建一个包含所需新内容的新记录。
你说你想“遍历”列表,但这不够具体,无法提供详细的建议。 List
模块中有用于各种遍历的函数:List.iter
、List.map
、List.fold_left
等。
例如,这里有一个函数,它增加了 'a map
类型值的所有成本:
let cost_incr map =
{ map with routes =
List.map (fun (a, b, c) -> (a, b, c + 1)) map.routes
}
(另请注意,在记录类型中的 cities
字段定义后需要 ;
。)
如果我有这样的数据结构
type cost = int
type 'a map = {
cities : 'a list
routes : ('a * 'a * cost) list
}
然后说我有一个带有 header 的函数,例如
let nearest_cities (m : 'a map) = ...
我想递归地遍历路由列表,最好和最干净的方法是什么?我尝试匹配记录,但是我不确定如何递归更新记录的参数
谢谢
你说你想更新记录,但是你定义的记录类型是不可变的。您无法更改此类记录的字段值。用函数式语言处理这个问题的通常方法是创建一个包含所需新内容的新记录。
你说你想“遍历”列表,但这不够具体,无法提供详细的建议。 List
模块中有用于各种遍历的函数:List.iter
、List.map
、List.fold_left
等。
例如,这里有一个函数,它增加了 'a map
类型值的所有成本:
let cost_incr map =
{ map with routes =
List.map (fun (a, b, c) -> (a, b, c + 1)) map.routes
}
(另请注意,在记录类型中的 cities
字段定义后需要 ;
。)