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

Posted

技术标签:

【中文标题】F#:通过模式匹配返回列表时出现问题?【英文标题】:F#: Problems when returning List of lists via pattern matching? 【发布时间】:2018-11-10 06:08:46 【问题描述】:

所以我有这段代码,基本上可以将列表按 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#,所以我正在这样做。

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

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】:

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

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

【讨论】:

以上是关于F#:通过模式匹配返回列表时出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Instagram API 获取关注者列表时出现问题?

在python中,如何通过匹配原始列表中的字符串模式从字符串列表中提取子列表

使用 += 但未附加列表时出现 UnboundLocalError [重复]

尝试在 Python 中扩展列表时出现类型错误

使用元组列表重塑数组时出现 mypy 错误

将值列表映射到浮点数时出现mypy错误