对于您的问题 - 是的,这些功能之间存在差异。现在解释一下:
如lists:splitwith/2 的文档中所述
根据Pred 将List 划分为两个列表。 splitwith/2 行为
好像是这样定义的:
splitwith(Pred, List) ->
{takewhile(Pred, List), dropwhile(Pred, List)}.
这意味着Pred(Elem) 从List 的第一个元素开始运行。 而 Pred(Elem) 返回true,Elem 将被添加到第一个列表中。 一旦我们找到Pred(Elem) 返回false 的元素,List 中的其余元素将进入第二个列表。
相比之下,lists:partition/2 在List 的所有 元素上运行Pred(Elem)。如果它为特定元素返回true,它将进入第一个列表,如果它返回false,则该元素将进入第二个列表。它不会在返回 false 的第一个元素上“停止”,例如在 lists:splitwith/2 中。
让我们看一下除了文档中给出的两个之外的另一个简单示例:
1> List = [a,b,a,b].
[a,b,a,b]
2> Pred = fun(Elem) -> Elem =:= a end.
#Fun<erl_eval.6.54118792>
3> lists:partition(Pred,List).
{[a,a],[b,b]}
4> lists:splitwith(Pred,List).
{[a],[b,a,b]}
如我们所见,Pred 函数在Elem =:= a 时返回true。
如果我们运行lists:partition/2,它将遍历所有元素。所以我们在返回的元组的第一个列表中从List 中获取所有等于a 的元素,其余的在第二个列表中。
如果我们运行lists:splitwith/2,迭代会在到达Pred(Elem) 返回false 的第一个元素时“停止”。在这种情况下,它会停在第二个元素 b 上,并且从这个元素到列表末尾的所有元素都将转到返回元组的第二个列表。