8
votes

Décapage de nouvelles lignes à Haskell

Qu'est-ce que le (ou existe-t-il un moyen idiomatique de dépasser les nouvelles lignes de chaînes de Haskell? Ou est-ce que je dois m'effacer le mien en trouvant les nouvelles lignes / espaces de fin, puis en les supprimant?

Edit: Je cherche ce que fait la rstrip de Python, mais n'a pas besoin de l'argument "caractères" optionnel:

string.rstrip (S [ caractères])

Renvoie une copie de la chaîne avec des caractères de fin supprimés. Si des caractères est omis ou aucun, blancheur les caractères sont enlevés. Si donné et pas aucun, les caractères doivent être une chaîne; la les caractères de la chaîne seront dépouillé de la fin de la chaîne Cette méthode est appelée.


1 commentaires

Alors que votre question et les diverses réponses donnaient affaire à la mise en œuvre de la fonction rstrip de Python dans HASKELL, l'utilisation n'est pas très idiomatique dans HASKELL dans la plupart des cas. Habituellement, vous utiliseriez lignes et mots , sauf une raison particulière, sinon.


5 Réponses :


3
votes

Selon ce que vous voulez dire:

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

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


1 commentaires

Aucun de ceux-ci ne «lande» la chaîne, cependant (dans le sens habituel de «Supprimer les caractères de direction ou de fin»).



10
votes

Voici une implémentation simple (adaptée de Wikipedia ): Xxx

Il y a aussi un rstrip déjà défini dans data.string.utils .

(Au fait, Hayoo! est une excellente ressource pour ce type de question: une recherche sur rstrip vous emmène directement à data.string.utils .)


1 commentaires

Je n'ai jamais regardé dans les données.String.utils avant. Utile. Et Rstrip ressemble exactement à ce qui est recherché.



1
votes

Il y a un échantillon au chapitre 4 du monde réel Haskell qui fait la fractionnement que vous voulez. Vous aurez besoin de coller les pièces ensemble lorsque vous avez terminé. http://book.realworldhakell.org/read/fonccunal-programming.htmlled/a >

recherche de "échauffement: des lignes de texte" dans le texte.


0 commentaires

5
votes

J'ai utilisé cela 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"


5 commentaires

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


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


Je pense que Trimnl = inverse. DROPHILE ( ELEM "\ N \ R \ T"). inverse serait plus proche du rtrim en python


Au cas où quelqu'un se soucie, mon appel à Elem a perdu les tiques arrière autour de lui lorsque j'ai soumis le commentaire.


TIM: Je ne suis pas sûr de ce qu'est-ce que l'évasion est (`testing` - yep c'est \ \), mais pour HASKELL, vous pouvez au moins utiliser Flip. trimnl = inverse. DROPHILE (Flip elem "\ n \ r \ t") .



4
votes

Si cela est pour une application de lecture de fichiers typique, vous devez probablement commencer par lignes code>. Cela peut vous permettre d'éviter data.string.utils.rstrip code> complètement: xxx pré>

comme vous pouvez le voir, lignes code> prend le texte de Le fichier entier et transforme correctement chaque ligne en une chaîne sans nouvelle ligne de fuite. Cela signifie que vous pouvez écrire un programme comme SO: P>

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


0 commentaires