Вы можете сжать список с последним элементом, отброшенным хвостом списка, а затем использовать понимание списка:
1> List = [1, 2, 3, 2, 1, 2, 2, 1, 1, 3, 1].
[1,2,3,2,1,2,2,1,1,3,1]
2> X = 1.
1
3> Zipped = lists:zip(lists:droplast(List), tl(List)).
[{1,2},
{2,3},
{3,2},
{2,1},
{1,2},
{2,2},
{2,1},
{1,1},
{1,3},
{3,1}]
4> [A || {A, B} <- Zipped, B == X].
[2,2,1,3]
Это неэффективно - создается копия списка (для droplast
) и новый заархивированный список.Вы можете использовать рекурсию вот так, чтобы сделать это эффективным:
-module(a).
-export([before/2]).
before(List, X) ->
before(List, X, []).
before([A, X | Tail], X, Acc) ->
before([X | Tail], X, [A | Acc]);
before([_ | Tail], X, Acc) ->
before(Tail, X, Acc);
before([], _, Acc) ->
lists:reverse(Acc).
1> c(a).
{ok,a}
2> a:before([1, 2, 3, 2, 1, 2, 2, 1, 1, 3, 1], 1).
[2,2,1,3]