ペアのリストを取り、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# はかなり新しい
私があなたを正しく理解していれば、数値の 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回反復するだけでよいと思うので、おそらくより効率的です)