【问题标题】:Determine type of 2 corresponding sets确定2个对应集合的类型
【发布时间】:2012-06-03 19:28:57
【问题描述】:

我已经声明了一个变量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通过a_to_b生成了这个b_best,也没办法。例如,如果b_bestbl 中的第四个元素,我认为al 的第四个元素就是我想要得到的。

我不想在函数find_best 中添加更多参数。我的问题是是否有一种传统的方法来定义albl 的类型,以便于从b_best 跟踪a_best,例如,使用array 而不是list?还是转换成array再转换成list回来?

【问题讨论】:

标签: arrays list types ocaml


【解决方案1】:

在许多情况下,我只定义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.nthal 检索值。如果您需要对长列表进行大量操作,List.nth 可能会太慢,因此您可能需要为al 使用数组。

【讨论】:

    【解决方案2】:

    你可以这样做:

    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 *)
    

    【讨论】:

    • 这当然假设b 类型支持=List.assq 可能是一个更好的选择(而且速度也快一点)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2010-12-23
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多