
On 29 April 2010 21:39, Jean-Nicolas Jolivet
Every solution I found was iterating to a list of character one character at a time, and outputting a character as a result (whether it is by recursion, mapping, etc..), however, what I was trying to explain in my previous post was that; when I am processing the escape character, this character should not be added to the resulting string... This is where I decided to use the Maybe monad..I'm just wondering if there is a better way...!
Hi Jean-Nicolas The 'hand crafted lexer' style is quite common for this, with different functions for different states (here body and escape). I use a Hughes list as an explicit accumulator (a Hughes list is sometimes called a difference list and familiar for strings as the ShowS type synonym). This has more efficient right-addition (snoc) than normal lists [a].
toString :: ShowS -> String toString = ($ [])
snoc :: ShowS -> Char -> ShowS snoc f a = f . (a:)
emptyH :: ShowS emptyH = id
escape :: String -> ShowS -> ShowS escape (_:xs) acc = body xs acc -- drop1, change state escape _ acc = acc -- oh dear escape to the end-of-string
body :: String -> ShowS -> ShowS body ('\\':xs) acc = escape xs acc -- change state body (x:xs) acc = body xs (acc `snoc` x) body _ acc = acc
run :: String -> String run xs = toString (body xs emptyH)
demo1 = run "\\s1234" -- "1234"
Best wishes Stephen