3

我已经声明了一个变量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_bestscore最大的一个。但是我的一个需求是我也想知道,这是通过什么a_best生成的,没有办法。例如,如果是 中的第 4 个元素,我认为第4 个元素就是我想要得到的。b_besta_to_bb_bestblal

我不想在函数中添加更多参数find_best。我的问题是,是否有一种传统的方法来定义 and 的类型albl以便于追踪a_bestb_best例如,使用array而不是list?或转换为array然后转换list回?

4

2 回答 2

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 *)
于 2012-05-29T14:56:20.990 回答
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来检索al. 如果您需要对长列表进行大量操作,List.nth可能会太慢,因此您可能希望使用数组来al.

于 2012-05-29T15:12:00.747 回答