list - 模式匹配 x::xs 没有在 F# 中相应地拆分列表?

标签 list f# cons

我是 F# 的新手,我正在尝试编写一个方法 split 将一个列表分成两部分。它需要一个元组,第一个元素是要拆分的元素数,第二个元素是列表。例如split(2, [1;2;3;4;5;6])应该返回([1;2], [3;4;5;6]),

这是我目前所拥有的,但出于某种原因,它返回元组的第二个元素作为没有头部的原始列表。我不明白这一点,因为我认为 x::xs 会自动使 x 成为头元素,而 xs 成为列表的其余部分,这意味着每次递归调用都会取前一个列表的尾部并砍掉第一项。

let rec split = function
   |(n, []) -> ([], [])
   |(0, xs) -> ([], xs)
   |(n, x::xs) -> let temp = x :: fst (split(n-1, xs))
                  (temp, xs);;

最佳答案

问题出在这一行:

(temp,xs);;

在您的示例中,xs 将始终是 [2;3;4;5;6] 只要 n>0

你需要用类似的东西得到列表的第二个元素

|(n,x::xs) ->
    let a,b = split (n-1,xs)
    (x::a,b)

关于list - 模式匹配 x::xs 没有在 F# 中相应地拆分列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32515913/

相关文章:

python - MySQL 使用列表推导式插入

python - 根据字符串中的数字对字符串列表进行排序

f# - 使用列表匹配绑定(bind)值(没有编译器警告)

list - `::` 和 `+:` 在列表前面有什么区别)?

python - 创建一个删除列表中重复项的函数

python - 查找列表的任何元素是否在另一个列表中

f# - 笛卡尔积两个 list

F# 管道运算符混淆

scheme - 方案说明中的缺点

file-io - 为什么 line-seq 返回 clojure.lang.Cons 而不是 clojure.lang.LazySeq?