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

到目前为止,这就是我所拥有的,但是由于某种原因,它会将元组的第二个元素作为没有头的原始列表返回。我不明白这一点,因为我认为x :: xs会自动使x成为head元素,而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)

09-11 19:26
查看更多