F #: Как обработать список кортежей? - PullRequest
0 голосов
/ 13 мая 2018

Я работаю над домашним заданием. И я пытаюсь изучить F #, поэтому я не хочу никаких ярлыков, кроме использования основных вещей, таких как List.Map или лямбда-выражения или что-то еще. Я пытаюсь обработать список кортежей, но у меня возникают проблемы с доступом к кортежам в списке. Я хочу взять список кортежей, сложить числа в каждом кортеже и вернуть это число, распечатывая его каждый раз.

let listTup = [(2,3,4); (4,5,6); (6,7,8)]

let getSum (a,b,c) =
    a+b+c

let rec printSum tpList =
let total = 0
match tpList with
| [] -> total //return 0 if empty list
| hd::tl -> 
    print (getSum hd)

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

F # также имеет императивные петли.В этом случае я думаю, что императивный цикл наиболее полно соответствует проблеме.

let listTup = [(2,3,4); (4,5,6); (6,7,8)]
for a,b,c in listTup do
  let sum = a + b + c
  printfn "%d" sum
0 голосов
/ 13 мая 2018

Первое, что вы хотите сделать, это отобразить ваши кортежи с помощью функции getSum.Это можно сделать очень просто, отправив список кортежей в List.map getSum.Затем вы хотите напечатать каждый элемент в списке, чтобы передать результат List.map getSum в List.iter с помощью функции printfn "%d".Это работает из-за функций, имеющих параметры карри.printfn "%d" применяет параметр "%d" к printfn и возвращает функцию, принимающую целое число, которое затем печатает.Все это будет выглядеть так:

let listTup = [(2,3,4); (4,5,6); (6,7,8)]

let getSum (a,b,c) =
    a + b + c

let printSum tpList =
    tpList |> List.map getSum |> List.iter (printfn "%d")

Это печатает:

9
15
21

Мы можем даже упростить функцию, если воспользуемся преимуществами композиции функций (оператор >>),Обратите внимание, что printSum принимает tpList в качестве параметра, а затем просто использует его в качестве входных данных для двух функций, которые передаются по конвейеру вместе.Так как конвейерная обработка просто принимает выходные данные одной функции и передает ее как последний параметр другой функции, все, что нам действительно нужно сделать, это составить функцию List.map getSum, которая принимает список int 3-кортежей и возвращает списокint с с List.iter (printfn "%d"), который принимает список int с и возвращает единицу измерения.Это будет выглядеть так:

let printSum = List.map getSum >> List.iter (printfn "%d")

Это выведет те же результаты, но это более простой способ выражения функции.

...