我正在尝试在 Erlang 中创建一个分区函数,其中第一个参数是谓词函数。
step(_, [ ]) ->
[ ];
step(N, C) ->
[_ | T] = C,
case (N > 0) and (length(C) > 0) of
true ->
step(N - 1, T);
false ->
C
end.
drop(_, [ ]) ->
[ ];
drop(Number, Collection) ->
step(Number, Collection).
partition_by(_, [ ]) ->
[ ];
partition_by(F, Collection) ->
[H | T] = [Collection],
Head_value = F(H),
Run = [H | lists:takewhile(fun(E) -> Head_value =:= F(E) end, T)],
[Run | partition_by(F, erl_funcs:drop(length(Run), Collection))].
但是调用它时:
partition_by(fun(E) -> E > 0 end, [-44444, -4555555, 455555]).
我得到:
[[[-44444,-4555555,455555]],[[-4555555,455555]],[[455555]]]
不完全是我想的那样。知道出了什么问题吗?
最佳答案
当您没有提供所需的输出时,我不知道它应该如何工作,但我尝试猜测。
partition_by(F, [H|T]) ->
partition_by(F, F(H), T, [H]).
partition_by(F, HV, [H|T] = L, Acc) ->
case F(H) of
HV -> partition_by(F, HV, T, [H|Acc]);
_ -> {lists:reverse(Acc), L}
end;
partition_by(_, _, [], Acc) -> {lists:reverse(Acc), []}.
关于algorithm - 在Erlang中实现partition_by函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669620/