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 xs
O (n) ist und O (n) mal genannt wird. Was ist die eleganteste Art, dies in Haskell so zu schreiben, dass es length
stoppt, 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 .