[Haskell-beginners] Re: Iterating through a list of char...
stephen.tetley at gmail.com
Thu Apr 29 17:16:47 EDT 2010
On 29 April 2010 21:39, Jean-Nicolas Jolivet <jeannicolascocoa at gmail.com> wrote:
> 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...!
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"
More information about the Beginners