Problems understanding serial Erlang

I studied the sample code, and I can’t understand what is happening, I tried to understand simpler examples and get them, but on this I got stuck:

seq([X, X | Xs]) -> [X | seq(Xs)];
seq([X, Y | Xs]) -> [X, Y | seq(Xs)];
seq(_) -> [].

When I run it in the shell with [1,1,1,2,2,2,3], I get [1,1,2,2]. I tried to figure out the steps by writing this on paper, but I was stuck halfway.

I would be grateful for all the answers explaining to me the steps taking place here! :) / Erie.

+4
source share
2 answers

So, we start with the list [1,1,1,2,2,2,3].

seq erlang 1 1 "" seq - seq([X, X | Xs]). , , [1, seq(Xs)]. Xs [1,2,2,2,3]. , Xs 1, / [X, X | Xs].

= [1 | ?] (? - , )
Xs= [1,2,2,2,3]

seq erlang 1 2 seq([X, Y | Xs]). [X, Y] [1, 2] Xs = [2,2,3].

= [1 | [1, 2 | ?]] < - , ?
Xs= [2,2,3]

, erlang . seq([X, X | Xs]) -> [X | seq(Xs)]. 2 seq([3]).

= [1 | [1, 2 | [2 | ?]]]
Xs= [3]

, . [3] [X, X | Xs] [X, Y, Xs], erlang catch-all: seq(_) -> []. _ -, - , do [].

: [1 | [1, 2 | [2 | []]]]. erl repl, , [1,1,2,2], - .

+11

:

1> dbg:tracer().
{ok,<0.35.0>}
2> dbg:p(self(), [c]).
{ok,[{matched,nonode@nohost,1}]}
3> dbg:tpl({test, seq, 1}, [{'_',[],[{return_trace}]}]).
{ok,[{matched,nonode@nohost,1},{saved,1}]}
4> test:seq([1, 1, 1, 2, 2, 2, 3]).
(<0.33.0>) call test:seq([1,1,1,2,2,2,3])
(<0.33.0>) call test:seq([1,2,2,2,3])
(<0.33.0>) call test:seq([2,2,3])
(<0.33.0>) call test:seq([3])
(<0.33.0>) returned from test:seq/1 -> []
(<0.33.0>) returned from test:seq/1 -> [2]
(<0.33.0>) returned from test:seq/1 -> [1,2,2]
(<0.33.0>) returned from test:seq/1 -> [1,1,2,2]
[1,1,2,2]
+4

All Articles