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? P>
Edit: Je cherche ce que fait la rstrip de Python, mais n'a pas besoin de l'argument "caractères" optionnel: p>
string.rstrip (S [ caractères]) p>
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. P> blockQuote>
5 Réponses :
Selon ce que vous voulez dire:
Prelude> filter (/= '\n') "foo\n\nbar\n" "foobar" Prelude> words "foo\n\nbar\n" ["foo","bar"]
Aucun de ceux-ci ne «lande» la chaîne, cependant (dans le sens habituel de «Supprimer les caractères de direction ou de fin»).
Voici une implémentation simple (adaptée de Wikipedia ): Il y a aussi un (Au fait, Hayoo! est une excellente ressource pour ce type de question: une recherche sur rstrip code> déjà défini dans data.string.utils code> . P> rstrip code> vous emmène directement à data.string.utils code>.) p> p>
Je n'ai jamais regardé dans les données.String.utils avant. Utile. Et Rstrip ressemble exactement à ce qui est recherché.
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 > p>
recherche de "échauffement: des lignes de texte" dans le texte. p>
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"
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 CODE> "\ 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") code>.
Si cela est pour une application de lecture de fichiers typique, vous devez probablement commencer par comme vous pouvez le voir, lignes code>. Cela peut vous permettre d'éviter data.string.utils.rstrip code> complètement: 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 --
Alors que votre question et les diverses réponses donnaient affaire à la mise en œuvre de la fonction
rstrip code> de Python dans HASKELL, l'utilisation n'est pas très idiomatique dans HASKELL dans la plupart des cas. Habituellement, vous utiliseriezlignes code> etmots code>, sauf une raison particulière, sinon.