web-dev-qa-db-fra.com

Comment obtenir le nième élément d'un 10-Tuple dans Haskell?

Je dois obtenir le nième élément dans un tuple Haskell. Et les tuples sont comme ceci: (3,5, "String1", "String2", "String3", "String4", "String5", "String6", "String7", "String8", "String9", "String10 "). Pouvez-vous me donner une idée pour que je puisse résoudre ce problème? Merci.

23
jason

Comme vous le savez ou non, fst et snd ne fonctionnent que pour les tuples à 2 éléments

fst' (a,b) = a

Pour autant que je sache, vous devez écrire votre propre

get5th (_,_,_,_,a,_,_,_,_,_) = a

Comme vous pouvez le voir, vous pouvez définir votre propre type.

31
DiegoNolan

Vous pouvez le faire avec la correspondance de motifs. Tout comme vous pouvez faire correspondre un tuple à deux ou trois valeurs, vous pouvez faire correspondre un tuple à dix valeurs.

let (_, _, _, _, _, _, _, _, _, x, _, _) = Tuple in x

Cependant, il est probable que vous ne souhaitiez pas le faire. Si vous essayez d'obtenir la nième valeur d'un tuple, vous utilisez presque certainement le mauvais type. Dans Haskell, les tuples de différentes longueurs sont différents types - ils sont fondamentalement incompatibles. Tout comme Int et String sont différents, (Int, Int) et (Int, Int, Int) sont également complètement différents.

Si vous voulez un type de données où vous pouvez obtenir le nième élément, vous voulez une liste: quelque chose comme [String]. Avec les listes, vous pouvez utiliser le !! opérateur d'indexation (qui commence à 0), vous pouvez donc simplement faire:

myList !! 9

pour obtenir le 10e élément.

Compte tenu de votre exemple, je suppose que vous voulez un type comme (Int, Int, [String]) plutôt qu'un gigantesque Tuple. Cela vous permettra d'avoir deux nombres et n'importe quel nombre de chaînes; vous pouvez obtenir les chaînes par index en utilisant le !! comme ci-dessus.

41
Tikhon Jelvis
22
Daniel Wagner

Si vous n'avez besoin de le faire qu'une fois par tuple et que vous avez besoin de tous les éléments à la fois, vous pouvez simplement utiliser

let (x, y, s1, s2, s3, s4, s5, s6, s7, s8) = someTuple
in ...

et utilisez directement les valeurs.

3
Zoey Hewll