2016-09-27 57 views
1

我一直在努力排序這個列表理解一段時間了,我不明白它的兩個具體的事情。Elixir你如何排序列表理解?

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) 

列表排序,但現在它顯示在列表中重複。 我的第二個問題是爲什麼理解的輸出包含重複項,如果我將它存儲在一個變量中,否則不包含它們?

這似乎是一個相當隨意的互動。

+0

什麼是span?你可以做'for(x < - ..,...)|> Enum.sort',但是你不可能在第一個代碼段中沒有重複,並且你在最後一個代碼段中有它。你可以發佈[MCVE](http://stackoverflow.com/help/mcve)嗎? – Dogbert

+0

@Dogbert對不起span只是範圍的實現。我正在編寫Programming Elixir一書,作者讓我們創建自己的範圍實現(實際上只是創建一個覆蓋範圍的列表),但是如果我將調用更改爲範圍,則其效果相同。 – smkarber

+0

對於x < - 2..10,y < - 2..10,x <= y,x * y <= n,轉換爲:[],do:x * y'確實有重複。 – Dogbert

回答

2

經過進一步閱讀,解決方案是在管道之前包含括號中的理解。

(for x <- span(2, n), y <- span(2, n), x <= y, x * y <= n, into: [], do: x * y) 
    |> Enum.sort 

上述代碼是解決方案。以塊格式管道解析時不需要括號,但內聯解析需要括號。 Elixir: error when piping to a function the result of inline comprehension

雖然我搜索靈藥理解我沒有發現這個問題,我的帖子之前,我不知道術語「內嵌的理解」:

我通過閱讀發現這一點。