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 проще (и, вероятно, более эффективен, поскольку я думаю, что ему нужно всего лишь один раз перебрать список)

Другие вопросы по тегам