Problems with Strings

Ulf Wiger etxuwig@REDACTED
Fri Mar 28 15:34:42 CET 2003


On Fri, 28 Mar 2003, Pablo Dejuan wrote:

>After looking at the API more carefully, I realized that to concat two
>strings you should use ++ (I know it's sounds silly but I was confused
>with other languages).
>So I'll rewrite it as:
>inversa("") -> "";
>inversa([A1|A]) -> inversa(A) ++ [A1].

You could do that, but be aware of the fact that append has
O(N) complexity. I some cases, this may not matter, but it's
always good to know.

Lists are represented as "cons" cells. Look upon them as
linked lists (without a "last" pointer). Using ++ to append
is about as expensive as traversing a normal linked list
from start to end each iteration in order to add one
element.

I assume that what you're after is something other than
simply reversing a string (since you can't beat
lists:reverse/1 for that). If you really want to implement
reverse in plain erlang, then this is the most efficient
version:

reverse(List) -> reverse(List, []).
reverse([H|T],Acc) ->
  reverse(T,[H|Acc]);
reverse([], Acc) ->
  Acc.

A few words then on ++

If you use ++ in hard-coded constructs like

 URL = "http://" ++ Location

this is no more expensive than

 URL = [$h,$t,$t,$p,$:,$/,$/|Location]

but some may find it easier to read.

You may also use ++ in pattern matching:

  location("http://" ++ L) ->
     L.

which is equivalent to

  location([$h,$t,$t,$p,$:,$/,$/|L]) -> L.


These constructs yield identical compiled code.

/Uffe
-- 
Ulf Wiger, Senior Specialist,
   / / /   Architecture & Design of Carrier-Class Software
  / / /    Strategic Product & System Management
 / / /     Ericsson AB, Connectivity and Control Nodes




More information about the erlang-questions mailing list