itérer sur une liste en haskell
J'ai une liste de liste de caractères ::[[Char]]
.
J'ai besoin d'itérer à la fois sur la liste de chaînes de caractères et également au-dessus de chaque personnage dans chaque chaîne.
Dire, ma liste est présent dans cette variable.
let xs
S'il vous plaît suggérer un moyen facile pour effectuer une itération.
Nous pourrions donner des conseils plus spécifiques si vous avez également expliqué ce vous voulez faire tout en "itération".
OriginalL'auteur code4fun | 2012-01-26
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez appliquer une fonction
f
à chaque élément d'une liste comme ceci:puis
map f xs
fait le tour.map
transforme une fonction sur les éléments d'une fonction sur les listes. Donc, nous pouvons en nid d'opérer sur les listes de listes: sif
transformea
s enb
s,map (map f)
transforme[[a]]
s en[[b]]
s.Si vous voulez faire quelque IO action pour chaque élément d'une liste (qui est plus classique, itération), alors vous êtes probablement à la recherche pour
forM_
:1Vous donner une fonction, et il l'appelle avec chaque élément de la liste dans l'ordre. Par exemple,
forM_ xs putStrLn
est un IO action qui affiche chaque chaîne dansxs
sur sa propre ligne. Voici un exemple plus impliqué l'utilisation deforM_
:Si
xs
contient["hello", "world"]
, alors ce sera l'impression: l'impression1
forM_
a effectivement un type plus général, mais la version plus simple que j'ai montré est plus pertinent ici.J'ai mis à jour ma réponse à montrer comment parcourir une liste d'effectuer IO tout en donnant un nom à chaque élément.
merci pour l'aide
Je fais IO, votre réponse semble aider beaucoup, mais je reçois un
Not in scope: ‘forM_’
. Une idée?Il a réglé avec
import Data.Foldable
. Comment se fait -forM_
prend la liste comme premier argument alors quefind
,map
et tous les autres de le faire dans l'autre sens?OriginalL'auteur ehird
La "bonne" façon d'itérer est en fait fois. Tout ce que vous pourriez jamais vouloir le faire avec une liste qui peut être fait avec un pli. Considérons ce que vous voulez faire. Vous pensez probablement à quelque chose comme ceci:
Le problème est, vous êtes probablement faire usage de variables mutables dans
doSomething
. C'est ok, on peut le gérer. Supposons donc que vous avez.Nous allons traduire que des plis. Et l'immuabilité.
Avis avec l'immutabilité, nous sommes contraints d'indiquer que
outAc'
dépendinAcc'
, plutôt que deinAcc
, de sens, de "l'état" deinnerVar
après il est mis à jour.Maintenant, vous pourriez dire "wow c'Haskell ressemble de manière moche, pourquoi aurais-je besoin pour utiliser Haskell". Oui, il fait moche, mais seulement parce que j'ai adaptée à une traduction directe de code impératif. Une fois que vous vous habituez à l'aide de plis au lieu de "itérer sur une liste", puis vous verrez que le pliage est une technique très puissante qui vous permet de faire beaucoup de choses de manière plus élégante que pour les boucles permettent.
map
est une spécialisation defold
.OriginalL'auteur Dan Burton
où
f :: Char -> Foo
est une fonction à appliquer à chaqueChar
etl :: [[Char]]
retourne
l' :: [[Foo]]
OriginalL'auteur Dan D.
Juste que:
OriginalL'auteur Laurent