【问题标题】:Enum.sum within Enum.map returns letters instead of integers [duplicate]Enum.map 中的 Enum.sum 返回字母而不是整数 [重复]
【发布时间】:2019-03-19 09:14:30
【问题描述】:

我正在尝试获取 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 个单独的数字相加。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    '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]
    

    进一步阅读:

    【讨论】:

    • 完美,非常感谢。没想到
    • 是的,初学者很困惑。我做的一个技巧是在列表中添加一个非打印字符。 0 效果很好。像 [0 | Enum.map(numbers, fn x -> Enum.sum(x) end)]。这应该打印 [0, 81, 32, 36]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2018-11-16
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2015-02-01
    相关资源
    最近更新 更多