Enum.map中的Enum.sum返回字母而不是整数

The*_*ugh 0 elixir

我试图获得17位数的列表数字,然后将其拆分Integer.digits,并得到这些数字的总和.不幸的是我一直在意外行为(我的结果包含一串字母)并且不确定这是一个错误还是个人错误.

下面是iex错误的控制台,结果给出'Q $':

iex(4)> numbers = [
...(4)>   [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, 7],
...(4)>   [1,5, 9, 4, 1, 3, 2, 7],
...(4)>   [1, 5, 4, 6, 5, 7, 8]
...(4)> ]
iex(5)> Enum.map(numbers, fn x -> Enum.sum(x) end)            
'Q $'
Run Code Online (Sandbox Code Playgroud)

但是当我从最后一个列表中删除一个数字时,它再次正常工作,并给出预期的结果

iex(1)> numbers = [ 
...(1)>   [1, 4, 8, 1, 3, 6, 9, 4, 2, 5, 5, 6, 3, 1, 8, 8, 7], 
...(1)>   [1,5, 9, 4, 1, 3, 2, 7], 
...(1)>   [1, 5, 4, 6, 5, 7]
...(1)> ]
iex(2)> Enum.map(numbers, fn x -> Enum.sum(x) end)
[81, 32, 28]
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?或者有一些解决方法,因为我的每个列表需要总计17个单独的数字.

She*_*yar 6

您的初步结果'Q $'是正确的,并且是初学者常见的混淆源.从技术上讲,你的结果应该是[81, 32, 36],而且确实如此.来吧,IEx亲自尝试一下:

iex> [81, 32, 36]
# => 'Q $'

iex> 'Q $' == [81, 32, 36]
# => true
Run Code Online (Sandbox Code Playgroud)

只是在Elixir中,查尔斯主义者看起来非常类似于字符串,并且由其中字符的代码点列表表示.至于为什么有时列表被打印为查询列表,有时不打印,这是因为只有当它们由有效的代码点组成时才会出现.


要将结果打印为实际列表而不是列表,您可以将适当的选项传递inspect:

result = Enum.map(numbers, fn x -> Enum.sum(x) end)
# => 'Q $'

inspect(result, charlists: :as_lists)
# => [81, 32, 36]
Run Code Online (Sandbox Code Playgroud)

您还可以将IEx配置为始终将列表打印为列表:

iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok

iex> 'Q $'
# => [81, 32, 36]
Run Code Online (Sandbox Code Playgroud)

进一步阅读: