
On 24/02/2015, at 3:50 am, Roelof Wobben
isValid :: [Char] -> Bool isValid s = go (words s) where go ([a]:b:_) = isLetter a && all isDigit b go _ = False
My attention was caught by the remarkably unhelpful name "go". What goes? Where does it go? What does going mean? This is a good time to use a 'case': isValid s = case words s of [a]:b:_ -> isLetter a && all isDigit b _ -> False
parseMessage :: [Char] -> [Char]
parseMessage s = isValid s where isValid = "Geldige string" _ = "Ongeldige string"
In the first line of this function, you are calling isValid with an argument. But you are defining isValid to be a string! parseMessage s = if isValid s then "Geldige string" else "Ongeldige string" "parseMessage: is a bad name because the purpose of the function is *NOT* to break the message into parts and deliver those parts but to CHECK or VALIDATE or CLASSIFY the message. The code import Data.Char isValid s = case words s of [a]:b:_ -> isLetter a && all isDigit b _ -> False parseMessage s = if isValid s then "Geldige string" else "Ongeldige string" main = putStrLn $ parseMessage "I 4764 He trusts to you to set them free," compiles without warnings and produces the result I think you want.