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

时间:2018-10-15 00:34:22

标签: 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 $'

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

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]

这是预期的行为吗?还是可以解决这个问题,因为我的每个列表都需要对17个数字进行求和。

1 个答案:

答案 0 :(得分:6)

您的'Q $'初始结果是正确的,并且是初学者的常见困惑。从技术上讲,您的结果应该是[81, 32, 36]。继续,自己在IEx中进行尝试:

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

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

只是在Elixir中,字符列表看起来非常类似于字符串,并由其中的字符代码点列表表示。关于为什么有时有时将列表打印为字符列表,有时却不将其打印为字符列表的问题,这是因为只有当它们由valid codepoints组成时才这样。


要将结果打印为实际列表而不是字符列表,可以从pass the appropriate optionsinspect

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

inspect(result, charlists: :as_lists)
# => [81, 32, 36]

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

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

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

更多读数: