我正在尝试编写一个将列表拆分为两个的方法.该函数应返回两个列表的元组,函数所采用的参数是第一个列表中的项目数,然后是列表.这就是我的意思
清单[1,2,3,4]
split(1,list) - >([1],[2,3,4])split(3,list) - >([1,2,3],[4])
这是我到目前为止所拥有的:
let rec mysplit = function
|(n,[])->([],[])
|(1,x::xs)->(x::[],xs)
|(n,x::xs)-> mysplit(n-1,xs)
Run Code Online (Sandbox Code Playgroud)
我不确定如何从递归调用中"捕获"元组.不知道在哪里有一个额外的let语句来暂时保存我正在构建的列表.对语言不熟悉所以有两种不同的方法可以学习.
跳过并带走是你的朋友.当有直接的方法时,我认为你不需要进行任何类型的匹配或递归调用.
let split n l = (l |> Seq.take n, l |> Seq.skip n)
Run Code Online (Sandbox Code Playgroud)
对于可能的边缘情况,如果> n列表中有元素,则skip将返回空序列,如果序列中有元素,则take将返回前n个元素< n.
尝试使用您的示例在TryFharp.org中尝试它,它按预期工作.