Nouveauté chez Haskell et vous avez une pierre d'achoppement. J'essaye de filtrer une liste de tuples basée sur le premier article. Je reçois une erreur "_" illégale, mais je ne suis pas sûr de la façon dont je peux la contourner?Liste de filtrage des tuples
Répondre
Dans Haskell, vous ne pouvez pas itérer sur un tuple comme vous pouvez le faire pour une liste.
Si le tuple n'a que deux éléments, vous pouvez utiliser fst
pour récupérer le premier élément du tuple et snd
pour récupérer le second élément.
Une façon de faire ce que je pense que vous voulez faire est cette approche:
Prelude> let lst = [(1,2), (3,4)]
Prelude> filter ((==1).fst) lst
[(1,2)]
qui renvoie uniquement les éléments de la liste où le premier élément est égal à 1; Bien sûr, vous pouvez remplacer x
où je mets 1.
Pour être un peu plus précis, (==1).fst
applique d'abord fst
à l'élément de LST, puis applique (==1)
au résultat de fst
- sur le plan technique, le point compose les deux fonctions ensemble.
Vous ne pouvez pas donner d'argument avec un caractère générique _
à l'opérateur ==
(ou à toute autre fonction). L'argument doit être une valeur réelle, pas un modèle qui doit être comparé.
Si vous voulez utiliser modèle correspondant, vous pouvez utiliser une fonction lambda comme vous filter
état:
filter (\(a,_) -> a == x) lis
En outre, il y a la fonction prédéfinie fst
pour extraire le premier élément d'un tuple à deux éléments. Cela peut être combiné avec ==
pour faire le même test:
filter ((== x) . fst)) lis
C'est génial, merci. Je me demandais ce que ceux-là faisaient sur tout l'exemple de code! – Zippy
Je pense que les utilisations de (. Et les différences entre) '.' et' $ 'sont l'un des obstacles les plus communs pour commencer Haskell - alors ne vous inquiétez pas, vous n'êtes pas le seul qui a eu des problèmes avec lui! –