F #: целые числа в пару целых чисел - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть функция, которая принимает список целых чисел в качестве аргумента и возвращает список пар в результате. Например, [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 ]

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

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

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

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
0 голосов
/ 08 ноября 2018

Вы можете использовать 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...