我试图写一种将列表分成两部分的方法。该函数应该返回两个列表的一个元组,函数接受的参数是第一个列表中的项目#,然后是列表。我的意思是
清单1、2、3、4
-> (1,2,3,4)拆分(3,列表)-> (1,2,3,4)
到目前为止,我的情况如下:
let rec mysplit = function
|(n,[])->([],[])
|(1,x::xs)->(x::[],xs)
|(n,x::xs)-> mysplit(n-1,xs)我不太清楚如何从递归调用中“捕获”元组。不知道在那里应该有一个额外的let语句来临时保存我正在构建的列表。新的语言,所以几种不同的方法将是很好的学习。
发布于 2014-01-25 17:53:12
跳过和带走是你在这里的朋友。当有直接方法时,我不认为您需要执行任何类型的匹配或递归调用。
let split n l = (l |> Seq.take n, l |> Seq.skip n)至于可能的边缘情况,如果列表中有> n元素,则skip将返回一个空序列,如果序列中有< n元素,take将返回前n个元素。
用您的示例在TryFharp.org中尝试了它,它如预期的那样工作。
发布于 2014-01-25 17:35:12
Lee的回答向您展示了一个可行的解决方案,但要回答您的具体问题,您可以捕获返回给您的值,如下所示:
let before, after = mysplit (2, [1;2;3;4;5])还可以使用此技巧在单个let语句中声明多个变量:
let i, j, k = (1, 2, 3)https://stackoverflow.com/questions/21353294
复制相似问题