2016-05-24 14 views
1

Ich bin neu in Haskell und ich kam in eine Sache, die ich scheinen kann around.So Ich habe diese Funktion zu kommen:Was bedeutet myFunction (x: y: xs) bedeuten in Haskell

merge :: [Int] -> [Int] 
merge xs = merged ++ padding 

where padding   = replicate (length xs - length merged) 0 
     merged   = combine (filter (/= 0) xs) 
     combine (x:y:xs) | x == y = x * 2 : combine xs 
         | otherwise = x  : combine (y:xs) 
     combine x  = x 

Das Problem irgendwie die Spitze meiner Liste ist, dass ich nicht ganz begreifen kann, was meine Forschung verbinden und fand does.I tat,

myFunction(x:xs) ... 

stellt dar, dass „x“ ist, und ich kann damit Dinge tun, nicht wahr? Does das bedeutet, dass in myFunction(x:y:xs) ... "x" ist das letzte Element und "y" wäre das zweite bis zum letzten Element in xs? I Ist das richtig, oder liege ich furchtbar falsch? Und was ist mit dem ":" nach "| x == y = x * 2 ", ich habe gelernt, dass in Haskell": "bedeutet, einen Wert an eine Liste anzuhängen, aber in diesem Kontext kann ich wirklich nicht ganz verstehen, was es tut ... Einige Hilfe würde sehr geschätzt werden.

Antwort

4

x:y:xs ist ein Muster, das sagt: "Dies ist eine Liste mit mindestens 2 Elementen. Wir werden die ersten und zweiten Elemente dieser Liste x und y nennen. Die verbleibende Unterliste, die wir xs nennen werden, kann leer oder nicht leer sein. "Das heißt, sie repräsentiert sowohl die Liste [1,2] und [1,2,3,4 .....] als auch [1] ].

Ihre zweite Abfrage kann durch Umschreiben

| x == y = x * 2 : combine xs

als

| (x == y) = ((x * 2) : combine xs) für Klarheit beantwortet werden. Dies ist ein Standard-if-else-Flow, mit der Ausnahme, dass Haskell Sie nicht benötigen zu setzen Beachten Sie, dass die "pipes" Wächter heißen und ähnlich wie eine switch-case Anweisung in Java/C# funktionieren.

+0

Also wenn ich etwas wie "kombinieren [2,2,4,8]" haben würde, wäre das Ergebnis [4,4,8], habe ich das richtig gemacht? –

+0

Ja, genau das! –

+0

Yey, vielen Dank für deine Antwort, das hat mir wirklich geholfen, Haskell ist gnadenlos, zumindest am Anfang –