2016-07-19 4 views
1

Версия: 1.2.2, ошибка:List.flatten возвращает неожиданное значение

List.flatten ([a,[b]]) is expected to return ([a,b]). However, this does not work properly for some cases. For example, List.flatten ([11, [[12], 13]]) returns '\v\f\r', when ([11,12,13]) is expected. Even List.flatten([10]) returns '\n'.

Почему это происходит и что это временное решение, если таковые имеются?

+3

Возможный дубликат [Списки эликсиров, интерпретируемые как списки символов] (http://stackoverflow.com/questions/30037914/elixir-lists-interpreted-as-char-lists) – Dogbert

ответ

0

Как объяснил greggreg, причина, по которой ваш последний список - [11,12,13] - выглядит как '\ v \ f \ r', заключается в том, что он содержит все печатаемые acsii-коды. Следовательно, output является charlist.

Если вам нужно получить номера из этого списка, вместо символов, вот что вы можете сделать:

iex> sample_list = [11,12,13] 
iex> [first | rest] = sample_list 
iex> [second | rest] = rest 
iex> [third | rest] = rest 
iex> first 
iex> 11 
iex> second 
iex> 12 
iex> third 
iex> 13 

Так в основном, когда вы принимаете ряд из списка, это время преобразуется в целое число. Теперь, поскольку это не список, он не может быть преобразован в charlist.

2

На самом деле это не связано с List.flatten, который отлично работает. Это просто вопрос печати печатных символов как символов ASCII. Эликсир, в отличие от многих языков программирования, рассматривает charlists как список целых чисел.

Например:

a = 'abc' 
hd a # 97 

Рассмотрим последний пример из this turorial.

Также помните, что интерпретация строк - это одно, но у вас все еще есть список целых чисел.

hd [12, 13, 14] # 12 
3

Если список состоит из целых чисел, которые все могут представлять для печати UTF-8 кодовые в ASCII набор будет выводиться на терминал в качестве charlist.

iex> [104,101,108,108,111] 
'hello' 

Но очень многое еще список:

iex> 'hello' ++ ' there' 
'hello there' 

Если он содержит любые непечатаемые элементы кода, он будет выводиться в виде стандартного списка:

iex> 'hello' ++ [0] 
[104, 101, 108, 108, 111, 0] 

You может видеть, какой код имеет символ, используя оператор ?:

iex> ?h 
104 

Мы можем получить информацию о перспективе использования i помощника в IEX:

iex> i 'hello' 
Term 
    'hello' 
Data type 
    List 
Description 
    This is a list of integers that is printed as a sequence of characters 
    delimited by single quotes because all the integers in it represent valid 
    ASCII characters. Conventionally, such lists of integers are referred to 
    as "charlists" (more precisely, a charlist is a list of Unicode codepoints, 
    and ASCII is a subset of Unicode). 
Raw representation 
    [104, 101, 108, 108, 111] 
Reference modules 
    List 

Почему Эликсир это сделать? Erlang.

+0

Это не происходит для всех (для печати) Unicode codepoints, только ASCII. Например. '[960] == 'π'' и' проверка ([960]) == "[960]" '. – Dogbert

+0

@ Dogbert, я думаю, что это просто ascii, а не unicode. Ответ обновлен. – greggreg