Если я правильно вас понимаю, у вас есть список из 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 является ее начальным значением). Если вам нужно альтернативное поведение, лучшее, что можно сделать, - это сопоставить шаблон в списке и выполнить сгиб в обычном списке, но вернуть значение по умолчанию в пустом списке. Вы можете использовать List.reduce (*)
, но вместо этого вы получите исключение в пустом списке.
Проверяя это в FSI с помощью ввода [(1,2); (1,2); (1,2)], я получаю результат (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 проще (и, вероятно, более эффективен, поскольку я думаю, что ему нужно всего лишь один раз перебрать список)