3

我是 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);;
4

1 回答 1

4

问题出在这一行:

(temp,xs);;

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

您需要使用类似的内容获取列表的第二个元素

|(n,x::xs) ->
    let a,b = split (n-1,xs)
    (x::a,b)
于 2015-09-11T05:42:36.463 回答