Зачистка строк в Хаскеле - PullRequest
6 голосов
/ 30 июля 2010

Как (или есть) идиоматический способ вырезать переводы строк из строк в Haskell? Или я должен создать свой собственный, найдя завершающие символы новой строки / пробелы и затем удалив их?

РЕДАКТИРОВАТЬ: Я ищу, что делает rstrip Python, но мне не нужен дополнительный аргумент "chars":

string.rstrip (s [, chars])

Возвращает копию строки с удаленными конечными символами. Если символы пропущен или отсутствует, пробел символы удалены. Если дано и не None, символы должны быть строкой; символы в строке будут раздели с конца струны этот метод вызывается.

Ответы [ 5 ]

10 голосов
/ 30 июля 2010

Вот одна простая реализация (адаптированная из Wikipedia ):

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

Существует также rstrip, уже определенный в Data.String.Utils.

(Кстати, Hayoo! - отличный ресурс для такого рода вопросов: поиск по rstrip приведет вас непосредственно к Data.String.Utils.)

3 голосов
/ 02 августа 2010

Если это типичное приложение для чтения файлов, то вам, вероятно, следует начать с lines. Это может позволить вам полностью избежать Data.String.Utils.rstrip:

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

Как видите, lines берет текст всего файла и правильно превращает каждую строку в строку без завершающей строки. Это означает, что вы можете написать программу так:

main = mapM_ (putStrLn . process) . lines =<< readFile "foo.txt"
  where process :: String -> String
        process = -- your code here --
3 голосов
/ 30 июля 2010

В зависимости от того, что вы имеете в виду:

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

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

Но это не очень хорошо с пробелами. Так что, возможно, не то, что вы ищете.

2 голосов
/ 30 июля 2010

Я использовал это на днях:

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"
1 голос
/ 30 июля 2010

В главе 4 есть пример из haskell реального мира, который выполняет желаемое разбиение.Вам нужно будет склеить кусочки вместе, когда вы закончите.http://book.realworldhaskell.org/read/functional-programming.html

Поиск в тексте слова "Разогрев: по-разному разбивая строки текста".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...