
Hello, I would do: doSmthg a = if a == 'a' then (const 'A') else id trans c = zipWith doSmthg (" " ++ c) c
trans "arga" "aAga"
The idea is to zip the string with the same string with an offset of character.
I thing my solution could be cleaner by using Maybe monad to handle
the first character's problem.
Corentin
On 4/28/10, Maciej Piechotka
On Wed, 2010-04-28 at 10:56 -0400, 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:
I assume i > 0 as otherwise my_string[i-1] is illegal
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
Very simple version:
func (x:xs) = x:helper x xs func [] = []
helper p (x:xs) | p == some_char = x':helper x' xs | otherwise = x'':helper x'' xs where x' = doSomething x x'' = doSomethingElse x helper p [] = []
or (for helper):
helper p (x:xs) = let x' | p == some_char = doSomething x | otherwise = doSomethingElse x in x':helper x' xs helper p [] = []
Advanced version (depends on state of character before change)
func s@(x:xs) = x:zipWith proc s xs where proc (p, x) | p == some_char = doSomething x | otherwise = soSomethingElse x
Advanced version:
func (x:xs) = let s = x:zipWith proc s xs proc (p, x) | p == some_char = doSomething x | otherwise = soSomethingElse x in s
It can be also expressed using folds. Choose version which suits you best.
Regards