F#: целые числа в пару целых чисел

У меня есть функция, которая принимает список целых чисел в качестве аргумента и возвращает список пар в результате. Например, [1;2;3;4] должен быть возвращен как [(1, 2); (3, 4)]

Я реализовал нижеприведенную функцию для этого.

let listToPairList (list: int list) = 
  let index,pairList = List.foldBack(fun elem (iAcc,listAcc) -> 
    if (iAcc % 2 = 0) then
      (iAcc - 1,(elem,list.[iAcc + 1])::listAcc)
    else
      (iAcc - 1,listAcc)) list (list.Length - 1, [])
  pairList

Теперь я хочу сделать это с помощью foldBack функция, но без использования индексов. Кто-нибудь может дать мне представление о том, как это сделать?

Любая помощь будет оценена.

2 ответа

Зачем использовать фолдбек?

Как насчет простой рекурсивной функции

let rec listToPairList = function
    | []       -> []
    | x::[]    -> [(x,x)]
    | x::y::xs -> (x,y)::listToPairList xs

Или хвост рекурсивный:

let listToPairList lst =
    let rec aux acc = function
        | []         -> acc |> List.rev
        | x::[]      -> (x,x)::acc |> List.rev
        | x1::x2::xs -> aux ((x1,x2)::acc) xs
    aux [] lst

Вы могли бы использовать int option чтобы отслеживать следующий элемент в сгибе:

let listToPairList (list: int list) = 
    let (_, pairList) = List.foldBack (fun elem (pairAcc, listAcc) -> 
                                        match pairAcc with
                                        | None -> (Some(elem), listAcc)
                                        | Some(next) -> (None, (elem, next) :: listAcc))
                                        list
                                        (None, [])
    pairList

Имейте в виду, что это удалит первый элемент в списке, если вход содержит нечетное количество элементов.

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