模式匹配 x::xs 未在 F# 中相应地拆分列表?
Pattern matching x::xs not splitting list accordingly in F#?
我是 F# 的新手,我正在尝试编写一个方法 split 将一个列表分成两部分。它需要一个元组,第一个元素是要拆分的元素数,第二个元素是列表。例如,split (2, [1;2;3;4;5;6]) 应该 return ([1;2], [3;4;5;6]),
这是我目前所拥有的,但由于某种原因,它return将元组的第二个元素作为没有头部的原始列表。我不明白这一点,因为我认为 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)
我是 F# 的新手,我正在尝试编写一个方法 split 将一个列表分成两部分。它需要一个元组,第一个元素是要拆分的元素数,第二个元素是列表。例如,split (2, [1;2;3;4;5;6]) 应该 return ([1;2], [3;4;5;6]),
这是我目前所拥有的,但由于某种原因,它return将元组的第二个元素作为没有头部的原始列表。我不明白这一点,因为我认为 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)