2016-07-19 2 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 코드 포인트가 포함되어 있기 때문입니다. 따라서 출력은 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 문자로 인쇄하는 것입니다. Elixir은 많은 프로그래밍 언어와 달리 charlists를 정수 목록으로 취급합니다. 예를 들어

는 :

a = 'abc' 
hd a # 97 

this turorial에서 마지막 예를 생각해 보자.

또한 문자열 해석이 한 가지이지만 여전히 정수 목록이 있음을 기억하십시오.

hd [12, 13, 14] # 12 
3

목록이 모두 ASCII에서 인쇄 UTF-8 코드 포인트는이 charlist으로 터미널에 출력됩니다 설정 나타낼 수 정수로 구성합니다.

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

그러나 그것은 아주 많이 여전히 목록입니다

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

당신에게 : 그것은 비 인쇄 코드 포인트가 포함 된 경우

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

, 그것은 표준 목록으로 출력됩니다 어떤 문자 코드 포인트가 ? 연산자를 사용하여 볼 수 있습니다.

우리는 IEX에 i 도우미를 사용하는 용어에 대한 정보를 얻을 수 있습니다 :

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 

왜 elixer이 일을합니까? 얼랭.

+0

모든 (인쇄 ​​가능한) 유니 코드 코드 포인트, ASCII 만. 예 : '[960] == 'π '' 그리고'inspect ([960]) == "[960]"'. – Dogbert

+0

@Dogbert 오른쪽, 나는 그것이 유니 코드가 아닌 ascii 일 뿐이라고 생각합니다. 답변이 업데이트되었습니다. – greggreg

관련 문제