ok then,

foo ('=':'=':x:xs) = foo ('=':x:xs)
foo ('=':x:xs)     = chr (ord x - 106) : foo xs
foo (x:xs)         = chr (ord x - 42)  : foo xs
foo _              = []

On 29 April 2010 21:31, matthew coolbeth <mac01021@engr.uconn.edu> wrote:
This works, except for the case where '=' appears more than twice consecutively.  A string of multiple '=' should be treated as a single '='.


On Thu, Apr 29, 2010 at 16:26, Ozgur Akgun <ozgurakgun@gmail.com> wrote:
I won't attempt writing a general-case function now. If I understood your (rather long) description correctly, you want to
- subtract 42 from the ascii value of the char, except when it is preceeded by '=', in which case you subtract 106 instead.

foo :: [Char] -> [Char]
foo ('=':x:xs) = chr (ord x - 106) : foo xs
foo (x:xs)     = chr (ord x - 42)  : foo xs
foo _          = []

Hope I understood the problem correctly.
Best,

On 29 April 2010 20:37, Jean-Nicolas Jolivet <jeannicolascocoa@gmail.com> wrote:
First I would like to thank everyone for the very interesting replies and suggestions I got so far!...

I tried to implement (and at the very least understand) most of them!...

To add to the context here, what I am trying to do is:

-apply a "transformation" to a character (in my case, subtracting 42 to its ASCII value, which I obtain with chr(ord(c) - 42)
-if the character is preceded by a specific character (that would be, an escape character, in this case '=') then subtract 106 to its value instead of 42...
-if the character is the escape character itself, '=',  then skip it altogether (keeping in mind that the next character needs to be escaped)...

I managed to do it, however I'm not totally satisfied in the way I did it... the problem was that... as I just explained, in some cases, the character that is being processed has to be "skipped" (and by that I mean, not added to the resulting string). This happens when the processed character IS the escape character...

What I did was to build a List of Maybe Char.... my function does the proper operation on the character and returns a "Just Char" when the character is processed, or Nothing when it is the escaped character... so basically I would end up with something like:  [Just 'f', Just 'o', Just 'o', Nothing]... I am mapping this using mapMaybe to end up with a proper String...

Would there be any more efficient way of doing this? Considering that the escape character should NOT be added to the resulting string, is there any way I can avoid using the Maybe monad?

Once again, thanks everyone for all the suggestions!

Jean-Nicolas Jolivet

On 2010-04-28, at 10:56 AM, Jean-Nicolas Jolivet wrote:

> Hi there!
>
> I'm trying to iterate through each character of a string (that part I
> can do!) however, I need to apply a transformation to each
> character...based on the previous character in the string! This is the
> part I have no clue how to do!
>
> I'm totally new to Haskell so I'm pretty sure I'm missing something
> obvious... I tried with list comprehensions...map... etc... but I
> can't figure out how I can access the previous character in my string
> in each "iteration".... to use simple pseudo code, what i need to do
> is:
>
> while i < my_string length:
>       if my_string[i-1] == some_char:
>               do something with my_string[i]
>       else
>               do something else with my_string[i]
>
> I'm using imperative programming here obviously since it's what I am
> familiar with...but any help as to how I could "translate" this to
> functional programming would be really appreciated!
>
>
> Jean-Nicolas Jolivet

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners



--
Ozgur Akgun

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners




--
mac



--
Ozgur Akgun