F#:通过模式匹配返回列表列表时出现问题?

时间:2018-05-31 09:15:57

标签: f# f#-interactive

所以我有这个代码,基本上将k个项目拆分。 所以,如果有列表[1; 2; 3; 4; 5; 6; 7]并且我想将第一个k = 3个项目分开,那么它会将列表拆分为[1; 2; 3]和[ 4; 5; 6; 7]。

我想要返回这两个,所以我的计划是将它们放入列表列表中,或者将它们放入2个列表的元组中会更好。 所以我回来了[[1; 2; 3]; [4; 5; 6; 7]]或([1; 2; 3],[4; 5; 6; 7])。

我也尝试过将两个列表转换为元组,但我无法弄清楚如何返回最后一个模式匹配的列表空元组。

另外,我知道这可以通过某种.take或.split函数更简单,但我正在尝试理解F#所以我这样做。

但请帮忙! 我的错误是: 期待一个 '' A'
但给了一个 ''列表'

let populateList k =
  let data = [1;2;3;4;5;6;7]
  let rec helper count aList =
    match aList with
    | head::tail when count < k ->
        let theTail = tail
        let newList = head :: helper (count+1) tail
        //let aTuple = (theTail,newList)
        //aTuple
        [theTail; newList]
    | _ -> []
    helper 0 data

 populateList 3

1 个答案:

答案 0 :(得分:3)

辅助函数必须跟踪结果列表才能在递归构造中工作。这是一个例子:

let populateList k =
  let data = [1;2;3;4;5;6;7]
  let rec helper count (first_k, rest) =
    if count < k then
        match rest with
        | a::tail -> helper (count+1) (a::first_k, tail)
        | _ -> ([],[])
    else (first_k |> List.rev, rest)
  helper 0 ([], data)

populateList 3