[erlang-questions] behavior of lists:append/1

zxq9 zxq9@REDACTED
Mon Sep 16 15:53:57 CEST 2019


On 2019/09/16 11:49, Richard O'Keefe wrote:
> The fact that L is a well-formed list is verified N times,
> for a total cost O(N * |L|).  But with the current definition,
> the cost is O(N), independent of |L|.

Hm... just to beat a dead horse...I suppose we could get away with a 
single check:

   -export([append/2]).

   append(Xs, Ys) when is_list(Ys) -> combine(Xs,Ys).

   combine([X | Xs], Ys) -> [X | combine(Xs, Ys)];
   combine([],       Ys) -> Ys.

> I will say that I've been using languages in the Lisp family for
> a little over 40 years, and this has been the very *least* of my
> problems.

The whole issue boils down to the above. I can see some trivial merit in 
doing a type check over Ys at the outset (since we'll crash on bad Xs in 
the actual procedure) but this business of moving to the last element to 
check whether the list is properly formed is both insane and almost 
certainly a legacy code killer, as there are a handful of systems out 
there that depend on being able to manipulate improper lists for 
whatever reason.

I didn't follow this thread closely, but I'm surprised I didn't see 
doing a single type check on entry as a possibility. What issues would 
make this a bad idea?

-Craig



More information about the erlang-questions mailing list