Vorletztes Element einer Liste in Haskell


Elliot Gorokhovsky

Betrachten Sie die folgende Funktion, um das vorletzte Element einer Liste zu finden:

myButLast (x:xs) = if length xs > 1 then myButLast xs else x

Dies ist ein O (n ^ 2) -Algorithmus, da er length xsO (n) ist und O (n) mal genannt wird. Was ist die eleganteste Art, dies in Haskell so zu schreiben, dass es lengthstoppt, sobald es über 1 hinausgeht, sodass der Algorithmus O (n) ist?

Melpomene

Der einfachste Weg ist zu vermeiden length:

myButLast (x : _ : []) = x  -- base case
myButLast (_ : xs)     = myButLast xs

Die endgültige Referenz zu Mustern in Haskell ist der Sprachbericht: https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17

GHC implementiert einige Erweiterungen, die unter https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/syntax-extns.html#pattern-guards beschrieben sind .

Verwandte Artikel


Vorletztes Element in die Liste aufnehmen

PyNoob: Ich kann das vorletzte Element einer Liste mit folgendem Ergebnis abrufen: >>> lst = ['a', 'b', 'c', 'd', 'e', 'f'] >>> print(lst[len(lst)-2]) e Gibt es einen besseren Weg als print(lst[len(lst)-2])das gleiche Ergebnis zu erzielen? Scott Hunter: Es gi

Erstes Element in einer Liste haskell

Q_96 Also muss ich eine find2-Methode machen, die das erste Element herausnimmt. Zum Beispiel find2 :: (a -> Bool) -> [a] -> a und find2 (>4) [1 .. 10] Sollte eine Ausgabe haben 5 Ich bin nicht gut mit Haskell, aber ich möchte es lernen. Mein erster Versuch wa

Vorletztes Element des Arrays umkehren

Feschka Dizovich Ich konnte keinen besseren Weg finden, als den String in das Array aufzuteilen: string str = "unknown printer took a galley of type and scrambled it to make a type specimen book"; string[] split = str.Split(' '); Console.WriteLine(split[split.

Bestimmen Sie, ob value ein Element einer Liste in Haskell ist

Matt Robbins Ich versuche, eine Funktion zu schreiben, die bestimmt, ob ein Element in einer Liste vorhanden ist, die beide vom Benutzer bereitgestellt werden. Ich denke, eine rekursive Lösung ist am besten. Das habe ich: isElement :: a -> [b] -> Bool isElemen

Haskell, komprimiere das Element einer Liste mit seiner Länge

Janik Ti Die nächsten Zeilen sollten zeigen, wie es funktionieren muss. [14,2,344,41,5,666] nach [(14,2),(2,1),(344,3),(5,1),(666,3)] ["Zoo","School","Net"] nach [("Zoo",3),("School",6),("Net",3)] Das ist mein Code bis jetzt zipWithLength :: [a] -> [(a, Int)]

Gibt das erste Element einer Liste in Haskell zurück

Kleiner Ball Wie gebe ich das erste Element einer Liste in haskell zurück? Ich verwende https://www.tutorialspoint.com/compile_haskell_online.php , um meinen Code zu kompilieren. Das habe ich bisher. main = head ([1, 2, 3, 4, 5]) head :: [a] -> a head [] = er

Schalten Sie jedes Element in einer Liste in haskell um

grüner Tee Ich muss eine Funktion schreiben, die eine Liste gegebener Boolescher Werte umschaltet, zum Beispiel: Eingabe: toggle [True,False,False] Ausgabe: [False,True,True] Das habe ich mir ausgedacht toggle :: [Bool] -> [Bool] toggle [a] = not a:[a] toggle

Prolog-Rekursion in Listen, vorletztes Element

user3186023 Die Frage ist, das vorletzte Zeichen in einer Liste zu finden, z ?- last_but_one(X, [a,b,c,d]). X = c. Mein Code lautet: last_but_one(X, [X,_]). last_but_one(X, [_|T]) :- last_but_one(X, T). und der Code, den sie gaben, ist: last_but_one(X, [X,_]

Triangularisieren einer Liste in Haskell

Peter Kagey: Ich bin daran interessiert, eine effiziente Haskell-Funktion zu schreiben triangularize :: [a] -> [[a]], die eine (möglicherweise unendliche) Liste in eine Liste von Listen "trianguliert". Zum Beispiel triangularize [1..19]sollte zurückkehren [[1,