From the homework:

data MessageType = Info
                 | Warning
                 | Error Int
    deriving (Show, Eq)

data LogMessage = LogMessage MessageType TimeStamp String
    deriving (Eq, Show)

data MaybeLogMessage = ValidM LogMessage -- A valid msg
                     | InvalidLM String  -- Invalid msg

parseMessage :: String -> MaybeLogMessage
parseMessage = undefined

To implement parseMessage, we consume the string from left to right word-by-word.
If the first word is E, then we read the second word as in integer indicating severity and proceed further.
Info and Warning don't require more information, so the next word will be the timestamp in those cases.
If the pattern fails anywhere, we return the whole string as an InvalidLM.

Hope this helps.


On 24 February 2015 at 06:37, Richard A. O'Keefe <ok@cs.otago.ac.nz> wrote:

On 24/02/2015, at 5:19 am, Roelof Wobben <r.wobben@home.nl> wrote:

> I tried it another way more like explained on this page :  http://www.seas.upenn.edu/~cis194/spring13/lectures/02-ADTs.html
>
> so I tried this :
>
> parseMessage :: [Char] -> [Char]
> parseMessage s
> case Errornumber of
>     IsDigit Errornumber  -> "Geldige string"
>     otherwise            -> "Ongeldige string"
>   where
>       Error = s words
>       Errornumber = Error(ErrorNumber _ _ )
>       Errorcode = Error(_ Errorcode _ )
>
> but now I cannot use where :(

That's not your problem.

IsDigit ErrorNumber is not a pattern.

parseMessage s =
    if isDigit errorNumber then "Geldige string"
    else                        "Ongelidige string"
  where
    errorNumber = ???

is OK.

Now I cannot make sense of
    Error = s words

        identifiers beginning with capital letters are used for
        - module names
        - type constructors
        - data constructors
        You want a variable here, so it must begin with a
        lower case letter.

        s words treats a string s as a function and applies it
        to the function words as argument: s(words).  But that
        does not type check.  You mean words s.

        The result of words s, whatever else it may be, is not
        an error.

    Errornumber = Error(ErrorNumber _ _)

        In the form "expr where pattern = expr", the thing after
        the equal sign must be an expression.  But
        Error(ErrorNumber _ _) is not an expression.  "_" is a
        PATTERN (= I do not care what goes here) but never an
        EXPRESSION (because what value would it have?).


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe



--
Regards

Sumit Sahrawat