[Haskell-beginners] Pattern matching with one, two or more arguments

legajid legajid at free.fr
Sun Nov 29 12:41:22 EST 2009


Hello,
I'm writing a little word game that consists of the following : between 
a consonant and a vowel, insert "AV" so "fabien" becomes "fAVabAVien".

When i type : f "fabine", the result is ok ("fAVabAVinAVe")
When i type : f "fabien", the result is fAVabAVie *** exception :prelude 
empty list

Here's my program

voyelles="aeiouy"
consonnes="bcdfghjklmnpqrstvwxz"

est_voyelle x = x `elem` voyelles
est_consonne x = x `elem` consonnes

--f []=[] ; unuseful - conflict with f a = a

f (a:b:c) =
    case trait a b of
        True -> a : (" AV " ++ f (b:c))
        False -> a : f (b:c)
f (a:b) =
    case trait a (head b) of
        True -> a : (" EP " ++ f ( b) )
        False -> a : f ( b)
f a =  a

-- detect a vowel following a consonant
trait a b = est_consonne a && est_voyelle b



f (a:b) is never invoked (i wrote EP instead of AV to trace the 
problem). f(a:b:c) seems to always take precedence over the other patterns.
I expect f(a:b:c) to treat words greater than or equal to 3 letters, 
f(a:b) the last two letters of the word (no third part) and f a the last 
letter.

Another trick : how can i calculate consonnes with a method that makes 
the difference between  the two lists [a..z] and  voyelles, rather  than 
writing each consonant.
As we can append two lists (++), can we compute the difference between 
lists, i.e. delete from the first list the elements that are present in 
the second one ?

Last, with Ghci, is it possible to debug my program, especially for 
recursive functions, because it's hard to follow the successive calls 
and the parameters that are passed each turn.

Greetings,
Didier.

 


More information about the Beginners mailing list