簡體   English   中英

Haskell 要列出的元組列表?

[英]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]

補充編輯:


traverseTraversable一起使用

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]) []

(對於相同類型的元素)

這也可以通過同構元組庫來實現(免責聲明:我是該庫的作者)。 它為元組定義了包裝器,使它們成為Traversable的實例(以及其他,例如ApplicativeMonad )。 所以可以通過toList. Tuple2 toList. Tuple2 (其中toList來自Data.Foldable )和

f :: [(a, a)] -> [a]
f = concatMap (toList . Tuple2)

您也可以將它用於其他元組,例如concatMap (toList. Tuple5)等。

f [] = []
f [(x, y) : xs] = x : y : f xs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM