F# взять список пар и вернуть пару
Попытка взять список пар и вернуть пару, которая является значениями x, умноженными на умноженные значения y: например: mult [(x,y);(x,y);(x,y)] будет (xx) x, yy y) mult [(1,2); ((1,2); (1,2)] вернет (1,8)
пытаюсь сделать это с картой FST и без рекурсии в настоящее время мой код:
let mult li =
match li with map fst li
довольно новый для F#
1 ответ
Если я вас правильно понимаю, у вас есть список из 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 проще (и, вероятно, более эффективен, поскольку я думаю, что ему нужно всего лишь один раз перебрать список)