J'essaie de m'apprendre à Haskell. Une chose que j'ai essayé de faire est d'écrire une fonction alternative pour renvoyer le dernier élément d'une liste en recrutant via la liste jusqu'à ce que la queue soit l'ensemble vide puis renvoyant la tête. J'ai ... ... mais je reçois une erreur lorsque j'essaie une liste non vide :(
Des suggestions sur ce que j'ai fait de mal?
TIA. P> P>
6 Réponses :
Essayez myLast [] = erreur "Liste vide!" code> à la place. Sinon, Haskell ne peut pas déduire le type de votre fonction. P>
La solution de EFFRAIM devrait fonctionner (voté à l'avance). Mais je pense que c'est un peu plus "Haskell-like":
mylast [] = Nothing mylast (x:[]) = Just x mylast (x:xs) = mylast xs
Le boîtier moyen est le même que [x], non? IOW, la liste d'éléments créée en concaténant X avec la liste vide "(x: [])" est identique à la liste contenant uniquement x "[x]". Je ne sais pas lequel est plus idiomatique, cependant.
Non, juste x n'est pas la même chose que [x].
Oh, attends, je vois ce que tu veux dire. Oui, le boîtier moyen est la liste ne contenant qu'un seul x. Mais toutes les listes peuvent être exprimées comme une tête et une queue, même si l'une ou les deux sont vides.
@Jorg - dire [x] Dans le casier moyen ne le limiterait pas à un élément, car X pourrait supporter une liste par elle-même. Donc x: [] est la bonne désignation. Il indique au compilateur que vous souhaitez faire correspondre à un seul élément concaténé sur une liste vide - qui garantit une liste d'un élément.
@RTPerson - Si le X signifie une liste, [x] [x] serait toujours une liste d'un élément, où cet élément est tout simplement une liste, n'est-ce pas? Bon sang, j'ai vraiment besoin de récupérer mon environnement Haskell.
@Jorg - La signature de type sur ['A'] and [1] sont ['A'] :: [Char] and [1] :: (num t) => [t] respectivement. Celles-ci me disent "la liste de tout". Mais je viens de m'essayer de votre chemin dans la fonction et ça marche, alors tu as raison. Personnellement, j'irais toujours avec la concaténation, juste pour rendre l'intention sous-jacente claire.
@Jorg - Oui, [x] code> est toujours une liste d'un élément.
Le problème - comme beaucoup d'autres lorsque vous apprenez Haskell - est l'une des dactylographes. Tapez les éléments suivants dans GHCI
mynextlast [] = error "no empty lists allowed" mynextlast (x:[]) = x mynextlast (x:xs) = mynextlast xs
Une leçon de ceci est qu'il est utile de spécifier les types de choses que vous définissez. Il fera que la compilation attrape des bugs tels que celui-ci ..
Merci pour les réponses à tous. J'ai essayé ... Mylast3 :: [a] -> Peut-être un myLast3 [] = rien myLast3 (x: []) = Just x myLast3 (x: xs) = myLast3 xs et je reçois par exemple ... MAIN> MYLAST3 [2,4,66,5,4,33] Juste 33 :: Peut-être entier y a-t-il de toute façon de ne pas imprimer le «juste»?
Merci pour les réponses à tous. J'ai essayé ... Mylast3 :: [a] -> Peut-être un myLast3 [] = rien myLast3 (x: []) = Just x myLast3 (x: xs) = myLast3 xs et je reçois par exemple ... MAIN> MYLAST3 [2,4,66,5,4,33] Juste 33 :: Peut-être entier y a-t-il de toute façon de ne pas imprimer le «juste»?
volontiers950: une manière d'utiliser des données.maybe.fromjust. Cela lancera une exception quand ce n'est rien.
Merci pour les réponses à tous. J'ai essayé ... et je reçois, par exemple, ... p> est là quand même de ne pas imprimer le 'juste 'Dans la réponse? p> [Modifier: Jörg W Mittag] (Les commentaires sont affreux pour la publication du code ...) P> Voici comment tout le code regarde dans le contexte: p>
Le point de la monade peut-être (et ce qui le distingue, disons, des pointeurs nulles dans les références C ou NULL en Java), est que la signature de type vous oblige à faire explicitement à traiter avec les deux cas: que quelque chose a été renvoyé et que rien n'était retourné. Donc, vous devrez expliquer explicitement correspondre aux deux cas et traiter avec eux séparément. Par exemple. Si vous souhaitez imprimer le résultat: mylook (juste a) = imprimez A! Newline! Mylook rien = faire une erreur "rien à voir ici, bouger!" !NOUVELLE LIGNE! Mylook $ myLast [2,4,66,5,4,33]
x <- myLast3 [2, 4, 66, 5, 4, 33] code>
Qu'en est-il de "DeJust $ MyLast [2,4,66,5,4,33]"? (Dejust est importé de données.Maybe)
myLast' [] = error "no empty lists allowed" myLast' [a] = a myLast' xs = xs !! (length xs - 1)
Ajoutez plus de contexte à votre réponse pour expliquer ce que ça fait.
mylast [x] = x mylast (x:xs) = mylast xs recursive call solution
Vous devriez accepter la réponse RTTPerson ...