我想將[1,2,3,4]
轉換成[[1 2] [2 3] [3 4]]
或[(1 2) (2 3) (3 4)]
。在clojure我有(partition 2 1 [1,2,3,4])
。我如何在Haskell中做到這一點?我懷疑在標準API中有這樣的功能,但我找不到它。成對列表中的元素
Q
成對列表中的元素
6
A
回答
19
標準的把戲這是zip
列表與它自己的tail
:
> let xs = [1,2,3,4] in zip xs (tail xs)
[(1,2),(2,3),(3,4)]
爲了說明爲什麼這工作,在視覺上排隊列表,它的尾巴。
xs = 1 : 2 : 3 : 4 : []
tail xs = 2 : 3 : 4 : []
並注意zip
正在從每列中製作一個元組。
有兩個更微妙的原因,這總是做正確的事:當任一列表用完元素
zip
停止。這是有道理的,因爲我們不能在最後有一個「不完整的對」,它也確保我們不會從單個元素列表中獲得對。- 當
xs
爲空時,可能會預期tail xs
發生異常。但是,因爲zip
首先檢查其第一個參數,當它看到它是空列表時,第二個參數 永遠不會被評估。
以上所有內容對於zipWith
都適用,因此,無論何時需要將函數成對應用於相鄰元素,您都可以使用相同的方法。
對於像Clojure的partition
這樣的通用解決方案,標準庫中沒有任何內容。但是,你可以嘗試這樣的事:
partition' :: Int -> Int -> [a] -> [[a]]
partition' size offset
| size <= 0 = error "partition': size must be positive"
| offset <= 0 = error "partition': offset must be positive"
| otherwise = loop
where
loop :: [a] -> [[a]]
loop xs = case splitAt size xs of
-- If the second part is empty, we're at the end. But we might
-- have gotten less than we asked for, hence the check.
(ys, []) -> if length ys == size then [ys] else []
(ys, _) -> ys : loop (drop offset xs)
1
只是拋出另一個答案有使用了不同的方法:
對於n = 2你想簡單zip
列表與它的尾巴。對於n = 3,您想要用尾巴和尾巴的尾巴來壓縮列表。這種格局進一步延續,所以我們要做的是概括它:
partition n = sequence . take n . iterate tail
但是,這只是一個作品抵消1.概括,我們只需要看看genrated列表中的偏移。它永遠有以下形式:
[[1..something],[2..something+1],..]
因此,所有剩下要做的就是選擇每offset
個元素,我們應該罰款。我shamelessy偷@ertes這個版本從this question:
everyNth :: Int -> [a] -> [a]
everyNth n = map head . takeWhile (not . null) . iterate (drop n)
整個函數現在變爲:
partition size offset = everyNth offset . sequence . take size . iterate tail
+0
不幸的是,你的概括給出了某種奇怪的排列 – flq
相關問題
- 1. 對齊列表元素中的元素
- 2. ArrayList中的元素對同一列表中的元素排序
- 3. 生成列表中隨機元素的一個元素
- 4. Stata:生成列表中所有可能的元素對
- 5. Tab鍵完成對列表中的元素
- 6. 加入列表中的元素對 - Python
- 7. 對於列表中的每個元素
- 8. 列表中的F#返回元素對
- 9. R:列表中的哪個元素對應於排序列表的元素
- 10. 對齊列表元素Sagemath
- 11. 如何將一個列表變成clojure中後續元素對的列表?
- 12. 對於'列表'中的'元素'(但不包括元素X)
- 13. 包含列表元素的列表的列表中的元素列表
- 14. 將列表轉換成元組有3個元素的列表?
- 15. 在「圓形列表」中懶惰地生成相鄰元素對
- 16. 將列表中的元素收集到相同元素列表的列表中?
- 17. 在Python中,給定元組列表,生成元素爲包含的元組元素之和的列表
- 18. 使用另一個列表(Python)在配對元素列表中查找元素
- 19. 對齊表中的元素
- 20. 從SoapUI列表中獲取元素對Groovy列表的響應
- 21. 如何拆分成對元素上的列表?
- 22. SyntaxError:missing]元素列表([對象對象])後
- 23. scala列表中的元素
- 24. 列表中的元素。
- 25. JDOM中的元素列表
- 26. 更新列表中的元素列表?
- 27. 訪問列表列表中的元素
- 28. 搜索列表中的元素列表
- 29. 列表中的球拍列表元素
- 30. 循環遍歷列表對的元素
爲什麼Clojure的電話本'partition'?如果你劃分了一些東西,那麼你分裂的方式就是這些部分的總和。 – AndrewC
哦 - 找到[clojure docs](http://clojuredocs.org/clojure_core/clojure.core/partition)描述「分區n步驟coll:返回列表中有n個項目的惰性序列,每個項目在偏移步驟 之外。如果沒有提供步驟,默認爲n,即分區 不重疊。「 – AndrewC