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_bestこのコードは、そのscore最大のものを見つけます。しかし、私のニーズの 1 つは、を介してこれをa_best生成する方法も知りたいということです。方法はありません。たとえば、 が の 4 番目の要素である場合、取得したいのはの 4 番目の要素であると考えます。b_besta_to_bb_bestblal

関数にこれ以上パラメーターを追加したくありませんfind_best。私の質問は、たとえば、の代わりに?を使用して、からトレースしやすくするために、 alandの型を定義する従来の方法があるかどうかです。または変換してから元に戻す?bla_bestb_bestarraylistarraylist

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多くの場合、ペアのリストを取得してペアを返すように定義するだけです。ペアの 2 番目の要素でポリモーフィックになります。

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

(または、2 つのリストを取るように定義することもできますが、これはあなたが求めているものとはさらに違うようです。)

あなたが述べた制約の下では、find_bestにアクセスできないため、インデックスを返し、後で使用して から値を取得するal必要があるようです。長いリストでこれを何度も行う必要がある場合は、遅すぎる可能性があるため、 に配列を使用することをお勧めします。List.nthalList.nthal

于 2012-05-29T15:12:00.747 に答える