Existe-t-il un moyen standard de fractionner une chaîne dans Haskell?
lines
et words
fonctionne très bien en fractionnant sur un espace ou une nouvelle ligne, mais il existe sûrement un moyen standard de fractionner sur une virgule?
Je n'ai pas pu le trouver sur Hoogle.
Pour être précis, je cherche quelque chose où split "," "my,comma,separated,list"
revient ["my","comma","separated","list"]
.
Data.List
ou mêmePrelude
. C'est tellement commun et méchant sinon disponible pour le code-golf.Réponses:
Il existe un package pour cela appelé split .
Utilisez-le comme ceci:
Il est livré avec de nombreuses autres fonctions pour diviser sur des délimiteurs correspondants ou avoir plusieurs délimiteurs.
la source
split
fonction qui répondra à tous les besoins, vous avez vraiment besoin de ce genre de paquet.split
à labuild-depends
liste dans votre fichier cabal, par exemple si votre projet s'appelle bonjour, alors dans lehello.cabal
fichier sous laexecutable hello
ligne, mettez une ligne comme `build-depend: base, split` (notez deux espaces en retrait). Puis construisez en utilisant lacabal build
commande. Cf. haskell.org/cabal/users-guide/…N'oubliez pas que vous pouvez consulter la définition des fonctions Prelude!
http://www.haskell.org/onlinereport/standard-prelude.html
En regardant là-bas, la définition de
words
est,Alors, changez-le pour une fonction qui prend un prédicat:
Alors appelez-le avec le prédicat que vous voulez!
la source
Si vous utilisez Data.Text, il existe splitOn:
http://hackage.haskell.org/packages/archive/text/0.11.2.0/doc/html/Data-Text.html#v:splitOn
Ceci est construit dans la plate-forme Haskell.
Donc par exemple:
ou:
la source
text
package ou de l'installer. Mais appartiendrait à une autre question.Dans le module Text.Regex (qui fait partie de la plateforme Haskell), il y a une fonction:
qui divise une chaîne basée sur une expression régulière. L'API peut être trouvée sur Hackage .
la source
Could not find module ‘Text.Regex’ Perhaps you meant Text.Read (from base-4.10.1.0)
Utilisation
Data.List.Split
, qui utilisesplit
:la source
Essaye celui-là:
Ne fonctionne que pour un seul caractère, mais devrait être facilement extensible.
la source
Sans importer quoi que ce soit une substitution directe d'un caractère pour un espace, le séparateur cible pour
words
est un espace. Quelque chose comme:ou
Vous pouvez en faire une fonction avec des paramètres. Vous pouvez éliminer le paramètre character-to-match my matching many, comme dans:
la source
Par exemple
Un seul délimiteur de fin sera supprimé:
la source
J'ai commencé à apprendre Haskell hier, alors corrigez-moi si je me trompe mais:
donne:
ou peut-être que tu voulais
ce qui serait:
la source
split
, étant gâté par des langues avec des bibliothèques bien développées. Mais merci quand même.Je ne sais pas comment ajouter un commentaire sur la réponse de Steve, mais je voudrais recommander la
documentation des bibliothèques GHC ,
et là-dedans spécifiquement les
fonctions Sublist dans Data.List
Ce qui est bien mieux comme référence, que la simple lecture du rapport Haskell.
De manière générale, un pli avec une règle sur le moment de créer une nouvelle sous-liste à alimenter devrait également le résoudre.
la source
En plus des fonctions efficaces et prédéfinies données dans les réponses, j'ajouterai les miennes qui font simplement partie de mon répertoire de fonctions Haskell que j'écrivais pour apprendre la langue à mon rythme:
Les solutions sont au moins récursives à la queue, donc elles n'entraîneront pas de débordement de pile.
la source
Exemple dans le ghci:
la source
ghci
?Je trouve cela plus simple à comprendre:
la source