[英]Haskell List of tuples to list?
是否可以將元組列表[(Int,Int)]
轉換為適用於任何輸入大小的通用方式? ..我在各種問題中看到這通常是不可能的
例子:
type X = [(Int,Int)]
func :: X -> [Int]
您的問題不太確定應如何將元組轉換為列表。 我假設您想讓它們變平 - 例如, [(1,2),(3,4)]
應該變成[1,2,3,4]
。
只有當您的元組的兩個元素屬於同一類型時,才能進行這種轉換。 在這種情況下,您可以執行以下操作:
tupleToList :: [(a,a)] -> [a]
tupleToList ((a,b):xs) = a : b : tupleToList xs
tupleToList _ = []
在一般情況下,這樣的翻譯是不可能的。 我可以想象使不可能成為可能的一件事是使用Either
來包裝兩種不同的類型:
tupleToList :: [(a,b)] -> [Either a b]
tupleToList ((a,b):xs) = Left a : Right b : tupleToList xs
鏡頭庫始終如一地處理這種情況和類似情況。
> import Control.Lens
> toListOf (traverse . both) [(1,2),(3,4)]
^ ^
| |> Traversal of the tuple (a, a)
|> Traversal of a list [b]
[1,2,3,4]
從列表列表轉換:
> toListOf (traverse . traverse) [[1,2],[3,4],[5,6,7]]
[1,2,3,4,5,6,7]
補充編輯:
traverse
與Traversable一起使用 traverse
將適用於任何具有Traversable
實例的數據類型,例如樹。
> import Data.Tree
> let t = Node 1 [Node 2 [Node 3 [], Node 4 []], Node 5 []]
> let prettyTree = drawTree . fmap show
> prettyTree t
1
|
+- 2
| |
| +- 3
| |
| `- 4
|
`- 5
> toListOf (traverse . traverse) [t, t]
[1,2,3,4,5,1,2,3,4,5]
您還可以使用折疊並避免顯式遞歸:
tupleToList = foldr (\(f,s) a -> f : s : a) []
或者:
tupleToList = foldl (\a (f,s) -> a ++ [f,s]) []
(對於相同類型的元素)
f [] = []
f [(x, y) : xs] = x : y : f xs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.