8
votes

Haskell convertit la liste à la liste des tuples

J'ai une liste comme celle-ci xxx

et je voudrais convertir en xxx

aide. Merci.


0 commentaires

3 Réponses :


15
votes
cnv :: [String] -> [(String, Integer)]
cnv [] = []
cnv (k:v:t) = (k, read v) : cnv t
If you want to handle odd-length just add cnv [x] = variant before last one

6 commentaires

Pouvez-vous expliquer ces lignes de code CNV (K: v: t) = (K, Lecture V): CNV T? AFAIK, le K v T est un paramètre de la liste K est la tête et V est la queue et le CNV T est un élément suivant comme k. Est-ce que ma compréhension est correcte parce que présidiosité j'ai fonctionne comme ceci. Convertir :: [String] -> [(chaîne, entier)] Convertir [] = [] Convert (x: Y: xs) = (x, y) convertir XS et pourquoi quand j'ajoute: XS ne fonctionne pas? Le K v T est-il représenté un élément unique de la liste ou de la liste entière?


Pas tout à fait: dans k: v: t , k est la tête et v: t est la queue. Ainsi, k: v: t met les deux premiers éléments de la liste dans k et v et la queue restante dans t < / code>. Votre code a deux problèmes évidents: (a) (x, y) a type (chaîne, chaîne) , pas (chaîne, entier) ; et (b) il n'y a pas de côlon avant convertit XS . (Vous ne pouvez pas simplement faire : xs , car vous avez besoin [(chaîne, entier)] mais xs a le type [chaîne ] .) De plus, une astuce de formatage: des lignes de retrait avec quatre espaces vides pour obtenir des blocs de code (ou sélectionnez votre code, puis cliquez sur le bouton "101010") et des extraits de code surround avec des backts (`... Code. ..`).


(x: xs) qui signifie x est la tête et l'élément restant est la queue pour XS. Merci pour votre explication.


@Antal S-Z a raison. (k: v: t) équivalent à (k: (v: t)) en raison de la déclaration infixr 5: dans ghc.types (aussi bien data [] a = [] | A: [A] vous dira de sens de (v: t) ou ou ou ou [] ).


(Ou sélectionnez votre code et cliquez sur le bouton "101010") et des extraits de code surround avec des backtstics ( ... code ... ). N'importe quel exemple. Comment faire cela manuellement? Je ne comprends pas ce que tu dis ici. (k: v: t) équivalent à (k: (v: t)) en raison de la déclaration infixe 5: dans GHC.Types (aussi bien que les données [] A = [] | A: [A] vous racontera la signification de (v: t) ou [])


L'instruction INFIXR 5: dit que : Groupes à droite avec précision 5. En d'autres termes, W: X: Y: Z est < Code> W: (x: (Y: z)) , pas ((w: x): y): z . Le 5 vous dit où il tombe dans la chaîne de prime; Par exemple, étant donné que * est livré avant + , * a la priorité 7 tandis que + a préséance 6. Qu'est-ce que le < Code> Données [] A = [] | A: [a] Déclaration vous indique est la définition de : et [] ; C'est-à-dire qu'ils construisent des parties de listes, etc. comme pour le formatage: il suffit de taper `avant votre code et` après cela. Lire L'aidation de l'édition pour plus.



8
votes

La solution de Ony's's's est un peu plus courte, Mais voici une version non récursive utilisant SplitTery du très pratique Split bibliothèque : xxx

Les étapes sont un peu plus claires (pour moi, à moins) que dans la version récursive.


2 commentaires

Ceci est définitivement plus naturel. La bibliothèque de Split ne reçoit pas assez d'amour. C'est dommage, car il est incroyablement utile.


Notez que SplitTery semble être obsolète maintenant; Utilisez Chunksof < / code> à la place.



3
votes

Exactement pour une tâche comme celle-ci, je trouve qu'il est pratique d'avoir une fonction code> Stride code> pour prendre chaque n-e élément de la liste:

[("peter",1000),("michell",2000),("kelly",3000)]


0 commentaires