Best way to achieve empty string

So in elixir sometimes you need to do something like this:

def function(acc, condition1, condition2) do
  acc <> 
   cond do
     condition1 -> "hello"
     condition2 -> "world!"
     true -> "" # Add nothing to acc
   end
end

Sometimes you need to use an empty string. Currently i only see two options for that

  1. using "" (empty string with two double qoutes)
  2. using <<>> (empty binary)

It would be a good thing if Elixir’s String module would provide a function like: String.empty/0 that would return a human readable form of empty string in Elixir.

But for now, Which way you think is better to use? 1 or 2? Or any other solutions?

I personally think that 2 is better since no special chars can hide inside it!

1 Like

Heh, now that Unicode is out in full force, that is not at all a bad point, hmm…

2 Likes

In Elixir code they mostly used "" as Empty string.

1 Like

I’m not sure if we really need String.empty/0. Thats very noisy and writing the empty string literally saves me a lot of keystrokes.

And if one should use "" vs. <<>>, well it depends. If I am dealing with String (meaning a sequence of unicode characters) I do prefer "" while I prefer to use <<>> when I am dealing with random binary garbdata.

1 Like

As string combining ({"", &<>/2}) forms a Monoid (Just like:

  • {0, &+/2},
  • {1, &*/2},
  • {false, &Kernel.||/2}
  • {[], &++/2},
  • {%{}, &Map.merge/2},
  • {MapSet.new(), &MapSet.union/2}
    et cetera…
    ) , both String.empty/0 and String.append/2 would be wonderful functions to have, making this behaviour more explicit :grin:.
1 Like

By that argumentation we also need Integer.one/0, Integer,zero/0, Integer.multiply/2, Integer.plus/2, List.empty/0, List.append/2, Map.empty/0, et cetera.

Monoids are true in elixir as they are in haskell, but not such a big thing. Also the monoid just works, regardles of using String.empty/0 or "".

I have to admit, sometimes one wants to/has to pass a function which returns the neutral of a monoid and since writing &("") or &""/1 isn’t possible, we have to use fn -> "" end, but that cases are so rare, that I do not think that there is really a benefit of adding such functions.

Also I have jsut discovered that there has been a PR closed by José:

https://github.com/elixir-lang/elixir/pull/6235

No, I think you didn’t got my point.

There are UTF-8 chars that are not visible. Like half space in Arabic and etc.
Since i write code with Persian strings in it, there is a common mistake that i press alt+Space that generates a half space which is not visible.

Here is an ordinary double quote → ""
Here is a half space between two double quotes → "‌"

Can you tell which one is the real empty one?

This problem is not affecting integers or list nor any other data type.[quote=“NobbZ, post:7, topic:6203”]
Also I have jsut discovered that there has been a PR closed by José:
[/quote]

As @josevalim commented in this PR today:

If this is a widespread problem, then we need to make sure those chars show up when inspected by default, rather than adding functions that return pre-built strings.

He suggested to tackle this issue by using a good string inspection that shows these things.

You diodn’t got whom I answered :wink: That was in direct resonse to @Qqwy comment about beeing {"", &<>/2} a monoid.

But in general, I think you are right, invisible characters are indeed a problem, but in my opinion, they are not a problem of a language. They are a problem of your editor and the display engine used therein.

Just consider C, they don’t have a function which creates an empty string, but can run into even worse trouble than we could when there are random invisible characters in their strings when they don’t expect them.

Sorry about that :sweat_smile:

I’m seeking an atom package that shows whitespaces. :slight_smile:

I just ran into this issue yesterday and it was frustrating to find out about that whitespace in my string.

Since i was a .NET developer before Elixir and back there it has string.Empty constant i thought maybe it’s a good idea here too.

But since that whitespace can happen in any other strings force showing them in editor will be a good idea. And since there are not lots of people using a keyboard with this kind of layout adding String.empty/0 does not make sense.

Thank’s

That is because C does not have standard strings, it has char-array’s at best.

C++ on the other hand does have an empty string, it is called string(). :slight_smile:

As well as a lot of C and C++ libraries that have strings do indeed add an empty global constant string variable.

I like seeing invisible chars, but I’ve not seen one that shows invisible unicode characters yet, if you find one that shows that, please tell me!

Elixir hasn’t either. It’s just a binary of bytes which happen to be printable when interpreted as unicode code points.

Indeed, but it does have a String module. :slight_smile:

C has strings.h

True but those tend to be very low-level calls, like C in general is. ^.^;

Have you never used binaries for protocols? :wink:

3 Likes

As in network protocols or as in elixir protocols?

So far I hadn’t had to implement one of the latter for binaries/strings.

But if indeed you mean the network stuff, of course I use that for that is appropriate in the context of the protocol to decode.

But to be honest, most of the time I just send term_to_binary over the wire and use some deserialiser at the receivers end or binary_to_term…

Network protocols! Bitstring syntax in network protocols in Erlang is an utter bliss compared to any other language I’ve used! ^.^

Like parse out the TCPv4 packet format from scratch, just for fun, then try it in any other language. ^.^

2 Likes

Yes, that’s a classic. I was planning to also show TCP packet but that was a bit too simple to really make an impression. :wink:

1 Like

I was able to nearly convience some co-students of mine to take a closer look at elixir last year, when I showed them a talk about HTTP2-Parsing via binary-pattern-matching. Finally they have then been scared away by the word “functional”. Our introductionary course uses haskell and sadly it scares people away from functional programming instead of luring them :frowning:

1 Like