2

ペアのリストを取り、x 値に y 値を乗算したペアを返そうとします: 例: mult [(x,y);(x,y);(x,y)] は (x x x,y y y) mult [(1,2);((1,2);(1,2)] は (1,8) を返します

map fst でこれを実行しようとしており、再帰はありません。現在、私のコードは次のとおりです。

let mult li = 
    match li with map fst li

f# はかなり新しい

4

1 に答える 1

4

私があなたを正しく理解していれば、数値の 2 タプルのリストがあり、単一の 2 タプルを返したいと考えています。ここで、最初の要素はリストのすべての最初の要素の積を表し、2 番目の要素は同様に、リストのすべての 2 番目の要素の積を表します。正しい?

これを行う最も簡単な方法は、おそらく次のようなものです。

let mult li = 
    let a,b = List.unzip li
    let product = List.fold (*) 1
    (product a, product b)

私の知る限り、F# にはデフォルトで List.product 高階関数が含まれていないため、便宜上作成しています。この積関数について注意すべきことの 1 つは、空のリストで呼び出された場合に 1 を返すことです (1 がその開始値であるため)。別の動作が必要な場合、最善の方法は、リストでパターン マッチを行い、通常のリストで折り畳みを行うことですが、空のリストではデフォルト値を返します。を使用できますList.reduce (*)が、代わりに空のリストで例外がスローされます。

入力 [(1,2);(1,2);(1,2)] を使用して FSI でこれをテストすると、結果 (1,8) が得られます。

fstおよび関数を使用する場合は、次のsndように変更できます。

let mult li = 
    let a = List.map fst li
    let b = List.map snd li
    let product = List.fold (*) 1
    (product a, product b)

ただし、 List.unzip の方が簡単です(リストを1回反復するだけでよいと思うので、おそらくより効率的です)

于 2018-11-05T19:59:22.240 に答える