2010-07-30 5 views
6

Quelle est la manière idiomatique (ou y en a-t-il une) de supprimer les nouvelles lignes des chaînes dans Haskell? Ou dois-je créer le mien en trouvant les nouvelles lignes/espaces finaux et en les retirant ensuite?Supprimer les nouvelles lignes dans Haskell

EDIT: Je cherche ce que le rstrip Python fait, mais ne pas besoin de l'argument optionnel "caractères":

string.rstrip (s [,]) CHARS

Retour une copie de la chaîne avec les caractères finaux supprimés. Si les caractères sont omis ou Aucun, les espaces blancs caractères sont supprimés. Si donné et non Aucun, les caractères doivent être une chaîne; les caractères dans la chaîne seront et seront supprimés de la fin de la chaîne cette méthode est appelée.

+2

Bien que les deux votre question et les différentes réponses données affaire dans la plupart des cas avec la mise en œuvre 'fonction rstrip' dans Haskell, son utilisation est pas très idiomatiques dans Haskell Python. Habituellement, vous utiliseriez 'lines' et' words', sauf s'il y a une raison spéciale pour le contraire. – Yitz

Répondre

9

est ici une mise en œuvre simple (adapté de Wikipedia):

import Data.Char (isSpace) 
rstrip = reverse . dropWhile isSpace . reverse 

Il y a aussi un rstrip déjà défini dans Data.String.Utils.

(Soit dit en passant, Hayoo! est une excellente ressource pour ce genre de question: une recherche de rstrip vous emmène directement à Data.String.Utils.)

+0

Je n'ai jamais regardé dans Data.String.Utils avant. Utile. Et rstrip ressemble exactement à ce que l'on veut. –

3

Selon ce que vous voulez dire:

 
Prelude> filter (/= '\n') "foo\n\nbar\n" 
"foobar" 

Prelude> words "foo\n\nbar\n" 
["foo","bar"] 

Mais ceux-ci ne traitent pas avec des espaces bien. Donc peut-être pas ce que vous cherchez.

+2

Aucun de ces éléments ne "dépouille" la chaîne, cependant (dans le sens habituel de "supprimer les caractères de début ou de fin"). –

2

J'ai utilisé l'autre jour:

Prelude> let trimnl = reverse . dropWhile (=='\n') . reverse 
Prelude> trimnl "" 
"" 
Prelude> trimnl "\n" 
"" 
Prelude> trimnl "a\n" 
"a" 
Prelude> trimnl "a\n\n" 
"a" 
Prelude> trimnl "a\nb\n" 
"a\nb" 
+0

C'est le même principe que la réponse de Travis. – kennytm

+0

Oui, je suppose que nous avons tapé en même temps.Mais le mien fait ce que l'affiche a demandé! Votez pour moi! :) –

+0

Je pense que trimnl = reverse. dropwhile ('elem'" \ n \ r \ t "). inverse serait plus proche de la rtrim en python –

3

Si cela est une application de fichier de lecture typique, alors vous devriez probablement commencer par lines. Cela peut vous permettre d'éviter complètement Data.String.Utils.rstrip:

> lines "one time\na moose\nbit my sister\n" 
["one time", "a moose", "bit my sister"] 

Comme vous pouvez le voir, lines prend le texte du fichier entier et tourne correctement chaque ligne dans une chaîne sans retour à la ligne de fuite. Cela signifie que vous pouvez écrire un programme comme ceci:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt" 
    where process :: String -> String 
     process = -- your code here -- 
Questions connexes