przemyxe0p

przemyxe0p

Hello
I am trying to understand types definitions in documentation https://hexdocs.pm/elixir/typespecs.html#built-in-types

Especially iolist() which is defined as

maybe_improper_list(byte() | binary() | iolist(), binary() | [])

I am not sure how to read pipe (|) and coma (,) in type definitions.

ChatGPT returned following:

:two: First Part: byte() | binary() | iolist()

This means each element in the list can be:

  • byte(): An integer from 0..255 (a single byte).
  • binary(): A binary string (<<...>>).
  • iolist(): Another iolist() (allowing nested lists).

:three: Second Part: binary() | []

This means the tail of the list can be either:

  • binary(): The list may end with a binary (improper list).
  • []: The list may end properly (normal list).

Which I’m not sure is true.
Please clarify

Showing Posts 1 to 7

fuelen

fuelen

This is true.
Improper list is a list where the tail is not an empty list.

# proper list:
iex(1)> [1, 2 | []]
[1, 2]

# improper list
iex(2)> [1, 2 | 3]
[1, 2 | 3]

| pipe means or. Think about maybe_improper_list as about function that returns a type, so it has 2 args and that’s why , comma is used.

przemyxe0p

przemyxe0p OP

So binary() | [] means that tail of the list can be binary() or []

maybe_improper_list(byte() | binary() | iolist(), binary() | [])

But if have such list I can pattern match it

[h | t] = list

so In tail I can have binary() or []
but in the same time t is like “rest of the list without first element”
and there could be elements like byte() binary() or iolist() is it because byte() binary() and iolist() are also binary() ?

garazdawi

garazdawi

Erlang Core Team

The second part describes the tail end of the entire list, not the tail of any list item. For example:

[1, 2, 3 | [] ]

In the above, the “First Part” in the type describes 1, 2, 3 and the “Second Part” describes only []. So in your example [h | t ], the type of t is the union of the “first part” and “second part” unless we know that it is the end of the list, then it is only the “second part”.

przemyxe0p

przemyxe0p OP

So in maybe_improper_list(byte() | binary() | iolist(), binary() | []), the second argument describes the tail, right? But in this context, the tail is just the last element of the list?

I took a deep dive into bitstrings, binaries, strings, and the rest, but now even though I know a lot, I’m still very confused. I watched a video, did Exercism, read documentation, but as you can see, I’m still asking questions.

Nevertheless, this is clarifying a lot:

The second part describes the tail end of the entire list, not the tail of any list item.

Based on that:

  1. iolist() must have [] or binary() as last element in it right? (String is UTF-8 encoded binary so it can be string to right?)
  2. last element can be binary() so it can be also byte()? is byte() just a binary() with 1 byte?
  3. Why there are type for byte() while it is just 1 byte binary() ?
garazdawi

garazdawi

Erlang Core Team
  1. Yes, a string is a subset of binary().
  2. A byte() is an integer between 0 and 255 inclusive, not a binary with a single byte.
  3. The byte() type is mostly used within lists, not within binaries.
przemyxe0p

przemyxe0p OP

Thanks, but when defining binary <<0,1,255>> aren’t we using byte() ? since it is 8 bit integer?

gregvaughn

gregvaughn

The binary “constructor” syntax, <<...>> accepts bytes, but it doesn’t produce a byte(). Try for yourself, see if <<0>> equals 0.

— All posts loaded —

Where Next? Top

Trending in Questions Top

Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
Onor.io
I have what I’ve heard referred to as a “lookup table” in my database. This is a way of assigning codes to common values. One common lo...
New
Trolleger
What approach to take when sending live updates to “random” users Hi! I have a question, I have a little chat app, and when I create a DM...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
matt-savvy
Anyone here using Honeybadger? My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of Bandit.HTTPError...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
wintermeyer
There are three potential reasons for members of this forum to have a look at https://vutuv.de You are tired or annoyed of LinkedIn. Yo...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews