2017-04-16 7 views
4

Ich möchte eine Liste von Listen wie diese machen:Wie zwei Listen in Haskell kombinieren

[1,2,3] [4,5,6] -> [[1,2,3], 4, 5, 6]

Das, was ich jetzt habe:

combine :: [a] -> [a] -> [[a]] 
combine xs ys = [xs,ys] 

Aber dieser Code gibt mir: [[1, 2, 3], [4, 5, 6]] und ist nicht was ich brauche.

+3

Sie nicht die folgende Liste haben: '[[1,2,3], 4, 5, 6]'. Nur das: "[[1,2,3], [4], [5], [6]]". Sie können stattdessen ein Tupel machen. – m0nhawk

+1

Um eine hinzuzufügen, was m0nhawk sagte, der Grund, warum Sie dies nicht tun können, ist, weil in Haskell-Listen homogen sind. Dies bedeutet, dass jedes Element der Liste den gleichen Typ haben muss. So können Sie eine Liste von Listen haben. Aber Sie können keine Liste haben, die sowohl Listen als auch Nummern enthält. Dies ist ein XY-Problem, Sie denken, Sie brauchen diese Datenstruktur, aber Sie nicht. Welches Problem lösen Sie eigentlich? – Keatinge

Antwort

6

Wie m0nhawk in den Kommentaren schreibt, kann man nicht direkt eine Haskell Liste der beiden Listen von ganzen Zahlen und ganze Zahlen haben. Es gibt jedoch mehrere Alternativen.


Eine Alternative ist in der Tat eine Liste von Listen von ganzen Zahlen zu verwenden ([[1, 2, 3], [4], [5], [6]]), wie folgt aus:

combine:: [Int] -> [Int] -> [[Int]] 
combine xs ys = [xs] ++ [[y] | y <- ys] 

main = do 
    putStrLn $ show $ combine [1, 2, 3] [4, 5, 6]    

(läuft dies in der Tat [[1, 2, 3], [4], [5], [6]] druckt).


Eine weitere Alternative ist die Verwendung algebraic data types:

Prelude> data ScalarOrList = Scalar Int | List [Int] deriving(Show) 
Prelude> [List [1, 2, 3], Scalar 4, Scalar 5, Scalar 6] 
[List [1,2,3],Scalar 4,Scalar 5,Scalar 6] 
+2

Übrigens, wenn Sie geben 'ScalarOrList' Instanzen von' Num' und [ 'IsList'] (http://hackage.haskell.org/package/base-4.9.1.0/docs/GHC-Exts.html#t: IsList) dann können Sie tatsächlich schreiben [[1,2,3], 4,5,6] '. Ich würde das aber nicht unbedingt für eine gute Idee halten. – leftaroundabout

+0

@leftaroundabout Danke für die nützliche Info! –

3

Es sind solche Dinge wie heterogene Listen in Haskell, aber sie sind nicht besonders trivial oder Anfänger freundlich:

https://hackage.haskell.org/package/hvect-0.4.0.0/docs/Data-HVect.html

Dies ist auch ein gutes Buch: https://wiki.haskell.org/Heterogenous_collections

Sie sind wahrscheinlich am besten dran versuchen, um zu sehen, wenn Sie Ihre eigenen Datentyp vornehmen können, die sowohl einfache Werte und Wertelisten kapselt:

data IntOrList = AnInt Int | AList [Int]

Aber dann werden Sie Ihre Werte auspacken müssen Dies könnte ein zusätzlicher Layer sein, mit dem Sie nicht umgehen möchten. Zumindest werden sie alle in der Lage sein, obwohl eine Liste zu teilen: someList = [AnInt 5, AnInt 7, AList [1, 2, 5, 8], AnInt 2]

Verwandte Themen