F#:整数到整数对

时间:2018-11-08 12:05:31

标签: functional-programming 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 个答案:

答案 0 :(得分:3)

为什么要使用折返?

一个简单的递归函数

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

答案 1 :(得分:1)

您可以使用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

请注意,如果输入中包含奇数个元素,它将删除列表中的第一项。