Le moyen le plus rapide pour obtenir le dernier élément d'une liste en Haskell
Quel est le moyen le plus rapide pour obtenir le dernier élément d'une liste en Haskell. Aussi dans la prochaine version, je veux supprimer en premier et dernier élément de la liste. Quelle est la façon la plus élégante de le faire? Je suis en train compréhension de liste, mais qui n'a pas l'air très efficace!
- Je pense récupérer le dernier élément efficace est difficile. Peut-être que vous devriez expliquer le contexte plus en détail, de sorte qu'on peut voir si il pourrait y avoir d'autres structures de données qui correspondent mieux à vos besoins.
- il y a peu de raison de douter que le Prélude.la dernière a une bonne mise en œuvre. La meilleure question, comme phimuemue dit, est de savoir si, si vous utilisez
last
beaucoup de choses que vous n'avez pas besoin d'autre chose que des listes, par exemple les Données.Séquence ou quelque chose de ce genre.
InformationsquelleAutor Dilawar | 2011-09-11
Vous devez vous connecter pour publier un commentaire.
last
etinit
va faire le travail tout aussi bien pour un one-off. Cependant, ils sont à la fois O(n), donc si vous avez besoin de manipuler les deux extrémités d'une liste souvent, comme vous semblez le laisser entendre, vous pouvez envisager d'utiliserde Données.Séquence
au lieu de cela, qui prend en charge O(1) d'insertion et de retrait des éléments aux deux extrémités.Vous pouvez utiliser le
dernier
function pour obtenir le dernier élément d'une liste.Comme pour comment faire pour supprimer le premier et le dernier élément, vous pouvez utiliser
(init . tail)
, mais je ne sais pas comment efficace qui est.Je pense que cette image de Apprendre Vous Un Haskell affiche la liste des fonctions assez bien:
(init . tail)
mal/missleading? Il devrait être(head . tail)
.Je vais poster le Prélude de la mise en œuvre car il n'a pas été publié pour le moment:
Noter que j'ai changé le nom de la fonction à
listLast
de sorte qu'il peut être exécuté sans entrer en conflit avec la normale Prélude. Vous pouvez, bien sûr, neimport Prelude hiding(last)
.last'
À supprimer la première et la dernière:
ou peut-être
Présente également les résultats dans presque un code optimal.
Cette réponse met l'accent sur la façon de traiter avec bizarre conditions (comme vide listes) dans un maximum de souplesse, et sur la construction de plus les fonctions à partir des plus petites à l'aide de certaines fonctions de la bibliothèque. C'est pas la meilleure réponse pour quelqu'un premier apprentissage sur les listes, mais plutôt quelques étapes passé.
Pour la suite, vous aurez besoin de
et vous aurez besoin d'utiliser soit GHC 7.10 et l'importation
Data.List (uncons)
ou de définirVous pouvez écrire un coffre-fort formulaire de
init
comme ceci:Une version de
tail
peut être écritAlors vous pouvez obtenir un maybefied
La
>=>
est une sorte de rétro monadique de la composition.init' >=> tail'
est une fonction qui s'appliqueinit'
à son argument pour obtenir unMaybe [a]
. Si elle obtientNothing
, il retourne que. Si elle obtientJust xs
, il s'appliquetail'
àxs
et des rendements.De cela, vous pouvez facilement faire une tondeuse que les garnitures de listes avec 0, 1 ou 2 éléments bas à vide listes:
Est une alternative à
last
pour obtenir le dernier élément.supprime le premier et le dernier élément de la liste. La source pour
drop
ettake
regarde comme il pourrait être plus rapide que(init . tail)
.est une autre variante. Mais je suppose que plus lent en raison de la double inversion.
length
est rarement quelque chose que vous voulez faire sans une bonne raison. Il n'y a pas de bonne raison ici. Il en va de même pourreverse
.