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() ?
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”.
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:
iolist() must have [] or binary() as last element in it right? (String is UTF-8 encoded binary so it can be string to right?)
last element can be binary() so it can be also byte()? is byte() just a binary() with 1 byte?
Why there are type for byte() while it is just 1 byte binary() ?