2015-03-06 2 views
1

Я изучаю Parsec и хочу попрактиковаться в реализации функции trim. Вот мой код:Как реализовать функцию обрезки с использованием Parsec в haskell?

module Trim where 
import Text.ParserCombinators.Parsec hiding(spaces) 
trim = reverse.trimFront.reverse.trimFront 
trimFront :: String->String 
trimFront = readExpr trimParser 
readExpr :: Parser String->String->String 
readExpr parser input = case parse parser "trim" input of 
          Left err -> error $ show err 
          Right val -> val 
spaces = many space 
trimParser :: Parser String 
trimParser = spaces >> many anyChar 

мой вопрос, как я мог бы реализовать trim в функции trimParser непосредственно, без необходимости реализовывать trimFront первый?

+2

Я предполагаю, что trimParser должен анализировать любую строку, включая строки, содержащие пробелы, игнорируя конечные и ведущие пробелы. Если это так, самый простой способ - это просто «разобрать» строку безоговорочно, а затем применить функцию trim к результату; 'отделка <$> много любойChar'. – user2407038

+2

Это действительно очень хорошая идея сказать, что именно должен делать ваш код, а не просто сбрасывать его на стол. – dfeuer

ответ

1

Чтобы обрезать пробелы с обеих сторон строки:

trim :: String -> String 
trim = dropWhileEnd isSpace . dropWhile isSpace 

Заметим, что вы можете быть лучше использовать следующую реализацию dropWhileEnd вместо одного из Data.List, в зависимости от ситуации:

dropWhileEnd :: (a -> Bool) -> [a] -> [a] 
dropWhileEnd p = foldr 
    (\x xs -> if null xs && p x then [] else x : xs) [] 
+0

Я знаю, как обрезать с обеих сторон, мне просто интересно, как реализовать обрезку с помощью 'Parsec'. – Alaya

+0

Похоже, вы собираетесь злоупотреблять Parsec. Есть ли какая-то конкретная причина, почему вы хотите обрезать с помощью Parsec? – Arnon

+0

@Arnon Первая строка его вопроса: «Я изучаю« Parsec »и хочу практиковать его, реализуя функцию' trim'. – MasterMastic

Смежные вопросы