Я также реализовал конкатенацию списков в Стиль прохождения продолжения :
-module(concat).
-export([concat_cps/2]).
concat_cps([], F) ->
F([]);
concat_cps([H|T], F) ->
concat_cps_1(H, T, F).
concat_cps_1([H|T], Rest, F) ->
concat_cps_1(T, Rest, fun(X) -> F([H|X]) end);
concat_cps_1([], Rest, F) ->
concat_cps(Rest, F).
Так что, если кому-то достаточно просто рекурсии, он может повысить управление потокомс замыканиями и продолжениями , как показано выше.
Тест:
1> concat:concat_cps([[1,2,3], [], [4,5]], fun(X) -> X end).
[1,2,3,4,5]
Второй аргумент concat_cps/2
- это продолжение, которое,когда concat_cps/2
сделано, принимает результат последнего.Тогда элемент управления concat_cps/2
никогда не возвращается.
В приведенном выше примере мы просто использовали морфизм идентичности , хотя мы могли бы передать любое другое допустимое продолжение, которое принимает плоский списокНапример:
2> concat:concat_cps([[1,2,3], [], [4,5]], fun(X) -> length(X) end).
5