[erlang-questions] List comprehension puzzler
Richard A. O'Keefe
ok@REDACTED
Mon Sep 19 02:51:46 CEST 2016
On 19/09/16 4:56 AM, lloyd@REDACTED wrote:
> 4> S = "123a456".
> "123a456"
The documentation is very clear:
Erlang reference manual section 3.12 Strings
http://erlang.org/doc/reference_manual/data_types.html#id71049
Strings are enclosed in double quotes ("),
but is(sic.) not a data type in Erlang.
Instead, a string "hello" is shorthand for the list
[$h,$e,$l,$l,$o], that is, [104,101,108,108,111].
When the shell sees a list that might have been a string,
it prints it as a string. So
> [65,66,67].
"ABC"
You entered a list of integers using string syntax.
The shell printed that list of integers using string syntax.
> 5> is_integer(S).
> false
Why would you ever have thought that S *might* be an integer?
If you want a hexadecimal integer, section 3.2 is clear.
16#123a456
is an integer in hex.
>
> 6> [is_integer(I) || I <- S].
> [true,true,true,true,true,true,true]
So you did know that S is a list.
>
> Please tell me what I don't understand.
That would require us to read your mind. What did you expect
to happen and why did you expect that?
Here's Prolog:
?- S = "123a456".
S = [49, 50, 51, 97, 52, 53, 54]
Yes
?- S = "123a456", member(X, S), \+ integer(X).
No
Here's Haskell:
Prelude> :type "123a456"
"123a456" :: [Char]
(That is, "123a456" is a list of characters. Char and Int are
distinct in Haskell, not in Erlang or Prolog.)
More information about the erlang-questions
mailing list