F # взять список пар и вернуть пару - PullRequest
0 голосов
/ 05 ноября 2018

пытается взять список пар и вернуть пару, которая представляет собой значения x, умноженные на значения y, умноженные: например: mult [(x, y); (x, y); (x, y)] будет (x x x, y y y) mult [(1,2); ((1,2); (1,2)] вернет (1,8)

пытаюсь сделать это с картой fst и без рекурсии в настоящее время мой код:

let mult li = 
    match li with map fst li

довольно новый для f #

1 Ответ

0 голосов
/ 05 ноября 2018

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

...