<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">Thanks, <br>
<br>
I see the problem.<br>
I m trying to push too much in a function.<br>
<br>
I see that in Haskell that a function does really 1 thing so I
function for checking the format and another for making the right
output. <br>
<br>
Roelof<br>
<br>
Alex Hammel schreef op 23-2-2015 om 21:52:<br>
</div>
<blockquote
cite="mid:CA+_xFepD5iK1J8GuWpgU3b-=EOPE_J=cLsaC=mbo1BaO82Rc1g@mail.gmail.com"
type="cite">
<div dir="ltr">Perhaps you could split up the format checking and
the unpacking into two different functions:<br>
<br>
parseMessage :: String -> String<br>
parseMessage s = go (words s)<br>
where<br>
go log = if isValid log<br>
then parse log<br>
else "false"<br>
<br>
parse ("I":time:msg) = "Info"<br>
parse ("W":time:msg) = -- etc.<br>
<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Feb 23, 2015 at 12:39 PM,
Roelof Wobben <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Oke, <br>
<br>
But then I do not check on the I <br>
Sorry for being difficult. <br>
<br>
Roelof<br>
<br>
<br>
<br>
Alex Hammel schreef op 23-2-2015 om 21:33:<br>
</div>
<div>
<div class="h5">
<blockquote type="cite">
<div dir="ltr">For that you need a guard:<br>
<br>
parseMessage :: String -> String<br>
parseMessage s = go (words s)<br>
where<br>
go logMessage<br>
| isValid logMessage = doSomething<br>
| otherwise = "false"<br>
<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Feb 23, 2015 at
12:30 PM, Roelof Wobben <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:r.wobben@home.nl"
target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0
0 0 .8ex;border-left:1px #ccc
solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Thanks, <br>
<br>
Can I somehow also test if the string is
valid so that the isvalid function is
used. <br>
<br>
Roelof<br>
<br>
Alex Hammel schreef op 23-2-2015 om 21:23:<br>
</div>
<div>
<div>
<blockquote type="cite">
<div dir="ltr">You can pattern match
on string literals:<br>
<br>
parseMessage :: String -> String<br>
parseMessage s = go (words s)<br>
where<br>
go ("I":_:_) = "Info"<br>
go _ = "false"<br>
<br>
<br>
You don't need to call it "go2",
btw. Functions in where-blocks don't
leak into the global scope, so
there's no conflict with the `go` in
your other function.<br>
<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Feb
23, 2015 at 12:15 PM, Roelof
Wobben <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:r.wobben@home.nl"
target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px #ccc
solid;padding-left:1ex">
<div bgcolor="#FFFFFF"
text="#000000">
<div>Sorry ,<br>
<br>
I cannot change that
function. I have to use it,
<br>
<br>
But I think I found a
solution for a step earlier,
<br>
<br>
To parse a line and change
it to another line which
will be a member of
LogMessage : <br>
<span> <br>
-- | Main entry point to
the application.<br>
{-# OPTIONS_GHC -Wall #-}<br>
<br>
module LogAnalysis where<br>
<br>
import Data.Char
(isLetter, isDigit)<br>
<br>
isValid :: String ->
Bool<br>
isValid s = go (words s)<br>
where<br>
go ([a]:b:_) =
isLetter a && all
isDigit b<br>
go _ = False<br>
<br>
</span> parseMessage ::
String -> String<br>
parseMessage s = go2 (words
s) <br>
where <br>
go2 (a:_:_) = case
a of<br>
"I" -> "Info "<br>
_ -> "False"<br>
<br>
go2 _ =
"false"<span><br>
<br>
<br>
-- | The main entry point.<br>
main :: IO ()<br>
main = do<br>
</span> putStrLn $
parseMessage "I 656 He
trusts to you to set them
free,"<br>
<br>
<br>
<br>
But I feels wierd, to use
first a pattern matching and
later do a case of.<br>
Is this a good way or are
there better ways, <br>
<br>
Roelfo<br>
<br>
<br>
<br>
Alex Hammel schreef op
23-2-2015 om 21:01:<br>
</div>
<div>
<div>
<blockquote type="cite">
<div dir="ltr">Constructors
with names like
'Unknown' are a code
smell, IMO. I'd just
define the data type
like this:<br>
<br>
data LogMessage =
LogMessage MessageType
TimeStamp String<br>
<br>
and use `Either String
LogMessage` in
contexts where parsing
can fail:<br>
<br>
parseLogEntry ::
String -> Either
String LogMesage<br>
parseLogEntry str<br>
| isValid str =
Right $ mkLogMessage
str<br>
| otherwise = Left $
"Poorly-formatted log
entry: " ++ str<br>
<br>
As for implementing
mkLogMessage: you
already know how to
unpack the parts of a
log message with
`words` and pattern
matching. After that
it's just a matter of
type-casting
everything correctly
and passing it to the
`LogMessage`
constructor.<br>
</div>
<div class="gmail_extra"><br>
<div
class="gmail_quote">On
Mon, Feb 23, 2015 at
10:14 AM, Roelof
Wobben <span
dir="ltr"><<a
moz-do-not-send="true"
href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote
class="gmail_quote"
style="margin:0 0
0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div
bgcolor="#FFFFFF"
text="#000000">
<div>Thanks, <br>
<br>
This works :
<br>
<span> <br>
-- | Main
entry point to
the
application.<br>
{-#
OPTIONS_GHC
-Wall #-}<br>
<br>
module
LogAnalysis
where<br>
<br>
</span><span>
import
Data.Char
(isLetter,
isDigit)<br>
<br>
isValid ::
String ->
Bool<br>
isValid s = go
(words s)<br>
where<br>
go
([a]:b:_) =
isLetter a
&& all
isDigit b<br>
go
_ =
False<br>
<br>
<br>
-- | The main
entry point.<br>
main :: IO ()<br>
main = do<br>
</span>
putStrLn $ (
show (isValid
"I 656 He
trusts to you
to set them
free,"))<br>
<br>
<br>
Now I have to
ty to find out
how I can
check if a has
the contents
of I/W/E and
how to make
the right
output
(Error/Warning/Info
22) " Text"
) <br>
and then make
it work with
this datatype
: <br>
<br>
data
LogMessage =
LogMessage
MessageType
TimeStamp
String<br>
| Unknown
String<br>
deriving
(Show, Eq)<br>
<br>
Roelof<br>
<br>
Konstantine
Rybnikov
schreef op
23-2-2015 om
18:49:<br>
</div>
<div>
<div>
<blockquote
type="cite">
<div dir="ltr">
<div>
<div>
<div>
<div>As Alex
mentioned,
isValid
returns Bool,
while type for
putStrLn is
`String ->
IO ()`. So, in
order to print
something of
type Bool, you
need to first
convert it to
String. For
example, via a
function
`show`:<br>
<br>
</div>
putStrLn (show
True)<br>
<br>
</div>
As Alex
mentioned,
there's a
`print`
function,
which does
exactly this:<br>
<br>
</div>
print x =
putStrLn (show
x)<br>
<br>
</div>
You can use
it.<br>
</div>
<div
class="gmail_extra"><br>
<div
class="gmail_quote">On
Mon, Feb 23,
2015 at 7:19
PM, Roelof
Wobben <span
dir="ltr"><<a
moz-do-not-send="true" href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote
class="gmail_quote"
style="margin:0
0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div
bgcolor="#FFFFFF"
text="#000000">
<div>And when
Im trying
this: <br>
<span> <br>
{-#
OPTIONS_GHC
-Wall #-}<br>
<br>
module
LogAnalysis
where<br>
<br>
import Log;<br>
import
Data.Char
(isLetter,
isDigit)<br>
<br>
</span>
isValid ::
String ->
Bool<span><br>
isValid s = go
(words s)<br>
where<br>
go
([a]:b:_) =
isLetter a
&& all
isDigit b<br>
go
_ =
False<br>
<br>
<br>
</span><span>
-- | The main
entry point.<br>
main :: IO ()<br>
main = do<br>
</span>
putStrLn $
isValid "I
4764 He trusts
to you to set
them free,"<span><br>
<br>
<br>
I see this
error message
: <br>
<br>
</span>
<div>src/LogAnalysis.hs@19:16-19:67
</div>
<div><span>Couldn't
match type </span>
<div
style="font-size:14px"><span>Bool</span></div>
<span> with </span>
<div
style="font-size:14px">[<span>Char</span>]</div>
<span>
Expected type:
String Actual
type: Bool</span><span
title="Click
to show/hide
extra
information">
…</span><span
style="display:inline"> In the second argument of ‘($)’, namely ‘isValid
"I 4764 He
trusts to you
to set them
free,"’ In a
stmt of a 'do'
block:
putStrLn $
isValid "I
4764 He trusts
to you to set
them free,"<br>
<br>
Roelof<br>
<br>
</span></div>
<br>
<br>
<br>
<br>
Roelof Wobben
schreef op
23-2-2015 om
17:19:<br>
</div>
<div>
<div>
<blockquote
type="cite">
<div>I tried
it another way
more like
explained on
this page : <a
moz-do-not-send="true"
href="http://www.seas.upenn.edu/%7Ecis194/spring13/lectures/02-ADTs.html"
target="_blank">http://www.seas.upenn.edu/~cis194/spring13/lectures/02-ADTs.html</a><br>
<br>
so I tried
this : <br>
<br>
parseMessage
:: [Char]
-> [Char]<br>
parseMessage s<br>
case
Errornumber of
<br>
IsDigit
Errornumber
-> "Geldige
string"<br>
otherwise
->
"Ongeldige
string"<br>
where<br>
Error =
s words<br>
Errornumber =
Error(ErrorNumber
_ _ )<br>
Errorcode =
Error(_
Errorcode _ )<br>
<br>
but now I
cannot use
where :( <br>
<br>
Roelof<br>
<br>
<br>
<br>
<br>
Roelof Wobben
schreef op
23-2-2015 om
16:10:<br>
</div>
<blockquote
type="cite">
<div>Oke, <br>
<br>
Then I make
there a
mistake,<br>
<br>
What I try to
do is to send
the file to
parseMessage
and let
IsValid check
if it´s have
the right
format. <br>
<br>
Then after the
where I try to
check if the
function
isValid
returns true
or false. <br>
<br>
Roelof<br>
<br>
<br>
Konstantine
Rybnikov
schreef op
23-2-2015 om
16:03:<br>
</div>
<blockquote
type="cite">
<div dir="ltr">
<div>
<div>
<div>Roelof,<br>
<br>
</div>
You defined
isValid
function in
the
upper-scope
first, and
then you
defined a
symbol
(variable)
that re-wrote
that name to
something
different
(string
"Geldige
string").
That's why you
get an error
saying it
doesn't expect
arguments.<br>
<br>
</div>
My suggestion
is to rename
second
isValid.<br>
<br>
</div>
Good luck.<br>
</div>
<div
class="gmail_extra"><br>
<div
class="gmail_quote">On
Mon, Feb 23,
2015 at 4:50
PM, Roelof
Wobben <span
dir="ltr"><<a
moz-do-not-send="true" href="mailto:r.wobben@home.nl" target="_blank">r.wobben@home.nl</a>></span>
wrote:<br>
<blockquote
class="gmail_quote"
style="margin:0
0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div
bgcolor="#FFFFFF"
text="#000000">
<div>Chaddaï
Fouché schreef
op 23-2-2015
om 13:20:<br>
</div>
<span>
<blockquote
type="cite">
<div dir="ltr">
<div>Note that
Roelof is
doing the CIS
194 Homework <a
moz-do-not-send="true"
href="http://www.seas.upenn.edu/%7Ecis194/fall14/hw/03-ADTs.pdf"
target="_blank">http://www.seas.upenn.edu/~cis194/fall14/hw/03-ADTs.pdf</a>
(the older
version of
fall2014, not
the one
currently
running). This
is much
clearer than
Roelof's
description,
and gives
among other
information an
algebraic
datatype to
represent log
messages.<br>
<br>
<br>
-- <br>
</div>
Jedaï<br>
</div>
</blockquote>
<br>
</span>
Correct and Im
trying to do
exercise 1 of
Week 2,<br>
<br>
I have tried
this solution
: <br>
<br>
-- | Main
entry point to
the
application.<br>
{-#
OPTIONS_GHC
-Wall #-}<br>
<br>
module
LogAnalysis
where<br>
<br>
import Log;<br>
import
Data.Char
(isLetter,
isDigit) <br>
<br>
isValid ::
[Char] ->
Bool <br>
isValid s = go
(words s)<br>
where<br>
go
([a]:b:_) =
isLetter a
&& all
isDigit b<br>
go
_ =
False <br>
<br>
parseMessage
:: [Char]
-> [Char]<br>
parseMessage s
= isValid s <br>
where <br>
isValid =
"Geldige
string"<br>
_ =
"Ongeldige
string"<br>
<br>
-- | The main
entry point.<br>
main :: IO ()<br>
main = do<br>
putStrLn $
parseMessage
"I 4764 He
trusts to you
to set them
free," <br>
<br>
<br>
but I see this
error message
: <br>
<br>
<div>src/LogAnalysis.hs@16:18-16:27
</div>
<div><span>Couldn't
match expected
type ‘[Char]
-> [Char]’
with actual
type </span>
<div
style="font-size:14px">[<span>Char</span>]</div>
<span> The
function </span>
<div
style="font-size:14px"><span>isValid</span></div>
<span> is
applied to one
argument, but
its type </span>
<div
style="font-size:14px">[<span>Char</span>]</div>
<span> has
none</span><span
title="Click
to show/hide
extra
information">
…</span><span
style="display:inline"> In the expression: isValid s In an equation for
‘parseMessage’:
parseMessage s
= isValid s
where isValid
= "Geldige
string" _ =
"Ongeldige
string"<br>
<br>
<br>
</span></div>
<br>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe
mailing list<br>
<a
moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a
moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</blockquote>
<br>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Haskell-Cafe mailing list
<a moz-do-not-send="true" href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a>
<a moz-do-not-send="true" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
</pre>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe
mailing list<br>
<a
moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a
moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe
mailing list<br>
<a
moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a
moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org"
target="_blank">Haskell-Cafe@haskell.org</a><br>
<a moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Haskell-Cafe mailing list
<a moz-do-not-send="true" href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a>
<a moz-do-not-send="true" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
</pre>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org"
target="_blank">Haskell-Cafe@haskell.org</a><br>
<a moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a moz-do-not-send="true"
href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a moz-do-not-send="true"
href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe"
target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</body>
</html>