2016-05-03 2 views
0

i habe eine Funktion, die zwei Elemente aus einer Liste nehmen und ein Element aus der zweiten Liste, aber es gibt ein Problem, wenn die gegebene Liste nur ein Element aufweist:Haskell, zwei Elemente aus einer Liste gefolgt von einem Element andere Liste? (Pattern matching)

Beispiel:

*Main> g2 [1] [5..10] 
[1] 

ich möchte eine Ausgabe wie diese haben:

*Main> g2 [1] [5..10] 
[1,5] 

Es ist für Liste arbeitet mit mehr als 1 Element:

*Main> g2 [1..5] [8..10] 
[1,2,8,3,4,9,5] 
*Main> g2 [1,2,3,4] [6,7,8,9] 
[1,2,6,3,4,7] 

Mein Code:

g2 (x1:x2:xs) (y:ys) = x1:x2:y:(g2 xs ys) 
g2 (x1:[]) y = x1:[] 
g2 [] ys = [] 

Ich denke, dass ich ein Muster vergessen.

+1

Ihre zweite Klausel direkt diesen Fall Adressen. Es adressiert es ganz offensichtlich nicht nach Ihrer Spezifikation! - Beachten Sie, dass Listen mit einer festen Anzahl von Elementen im Allgemeinen mit Listensyntax anstelle von ':' konstruiert/dekonstruiert werden, d. H. Schreiben Sie '[x & sub1;]' anstelle von 'x & sub1;: []'. – leftaroundabout

Antwort

2

so verwirrend wie Ihre Frage ist, ist dies die Antwort:

g2 (x1:x2:xs) (y:ys) = x1:x2:y:(g2 xs ys) 
g2 (x1:[]) (y:ys) = x1:y:[] 
g2 [] [] = [] 
-- Added missing patterns, don't know what the function is supposed to do here 
g2 [] (y:ys) = [] 
g2 (x1:xs) [] = [] 
+0

Sorry, mein Englisch ist nicht sehr gut, manchmal werden meine Fragen zu kryptisch :) Wie genau sind die beiden Muster g2 [] (y: ys) = [] g2 (x1: xs) [] = [] lösen das Problem ? –

+2

Ich habe sie nur hinzugefügt, um alle möglichen Fälle abzudecken, so dass Sie keinen Laufzeitfehler bekommen, dass Ihre Funktion für solche Argumente nicht definiert ist. Es wird nur '[]' dann – Alistra

+0

Okey ich verstehe und Mustervergleich nützlich ist, wenn Sie große Funktionen erstellen möchten? (Frage von einem Haskell Anfänger, tut mir leid) –

Verwandte Themen