我已声明变量al : 'a list
,函数a_to_b : 'a -> 'b
和函数score : 'b -> int
。然后,以下代码中的let bl = List.map a_to_b al in ...
定义了bl : 'b list
。
let find_best (bl : 'b list) : 'b =
let score_best, b_best = List.fold_left
(fun (score_old, b_old) b_new ->
let score_new = score b_new in
if score_old < score_new then
(score_new, b_new) else
(score_old, b_old))
(score (List.hd bl), List.hd bl) bl in
b_best
let bl = List.map a_to_b al in
find_best bl
这段代码找到b_best
,使其score
最大。但我的一个需求是,我也想知道,a_best
通过b_best
生成此a_to_b
,并且没有办法。例如,如果b_best
是bl
中的第4个元素,我认为al
的第4个元素就是我想要的。
我不想在函数find_best
中添加更多参数。我的问题是,是否存在定义al
和bl
类型的传统方法,以便从a_best
轻松跟踪b_best
,例如,使用{{ 1}}而不是array
?或转换为list
然后转换为array
回来?
答案 0 :(得分:3)
你可以这样做:
let abl = List.combine bl al in (* ('b * 'a) list *)
let a_best = List.assoc b_best abl (* returns the value associated to b_best *)
答案 1 :(得分:2)
在很多情况下,我只是定义b_best
来获取对的列表并返回一对。它在对的第二个元素中是多态的:
let find_best (bl : ('b * 'a) list) : 'b * 'a =
let score_best, ba_best = List.fold_left
(fun (score_old, (b_old, a_old)) (b_new, a_new) ->
let score_new = score b_new in
if score_old < score_new then
(score_new, (b_new, a_new)) else
(score_old, (b_old, a_old)))
(score (List.hd bl), List.hd bl) bl in
ba_best
(或者您可以将其定义为两个列表,但这似乎更像您所要求的。)
根据您声明的限制,find_best
无权访问al
,因此您似乎必须返回索引并在之后使用List.nth
从{{1}检索值}}。如果您需要对长列表执行此操作,al
可能太慢,因此您可能希望将数组用于List.nth
。