我一直在努力对这个列表理解进行排序,但我不明白关于它的两个具体事情。
for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y
它的作用是创建一个包含最多 n 个非素数的列表。现在,如果我尝试:
for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y
|> Enum.sort
for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y
|> Enum.sort()
两种方法都会给我错误:
protocol Enumerable not implemented for 4
所以我的第一个问题是如何使用管道对推导式进行排序?
编辑::由于存在重复项而被删除,而我没有注意到它们=>
如果我尝试:
comps = for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y
Enum.sort(comps)
列表已排序,但现在列表中显示重复项。 我的第二个问题是,如果我将理解的输出存储在变量中而不包含它们,为什么它会包含重复项?
这似乎是一种相当随意的交互。
最佳答案
进一步阅读后,解决方案是在管道之前将理解包含在括号中。
(for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y)
|> Enum.sort
上面的代码就是解决方案。以 block 格式传递推导式时不需要括号,但内联推导式需要括号。
我通过阅读发现了这一点:Elixir: error when piping to a function the result of inline comprehension
虽然我搜索了 Elixir 理解,但在发帖之前我没有发现这个问题,因为我不知道术语“内联理解”。
关于sorting - Elixir 如何对列表理解进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39723004/