确定2个相应集的类型

时间:2012-05-29 14:44:36

标签: arrays list types ocaml

我已声明变量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_bestbl中的第4个元素,我认为al的第4个元素就是我想要的。

我不想在函数find_best中添加更多参数。我的问题是,是否存在定义albl类型的传统方法,以便从a_best轻松跟踪b_best,例如,使用{{ 1}}而不是array?或转换为list然后转换为array回来?

2 个答案:

答案 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