Unable to sequence using 'do' operator

type Parser a = String -> [(a, String)] Hi, I am learning haskell and wondering why my definition of firstAndThird does not work with the do operator, however when i try to use the same using bind (firstandThird2) it works as expected. I basically want to return a tuple of first and third character of a string. Can someone please correct me what i might be overseeing? I have pasted the same code on codetidy in case if the email lose formatting. http://codetidy.com/5726/ Many Thanks, Rohit zero :: Parser a zero = \inp -> [] result :: a -> Parser a result x = \inp -> [(x, inp)] item :: Parser Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)] bind :: Parser a -> (a -> Parser b) -> Parser b p `bind` f = \inp -> concat [ ((f x) inp') | (x, inp') <- p inp] sat :: (Char -> Bool) -> Parser Char sat predicate = item `bind` (\x -> if predicate x then result x else zero ) lower :: Parser Char lower = sat (\x -> 'a' <= x && x <= 'z') firstAndThird :: Parser (Char, Char) firstAndThird = do x <- item item y <- item return (x,y) firstAndThird2 :: Parser (Char, Char) firstAndThird2 = item `bind` \x -> item `bind` \y -> item `bind` \z -> result (x,z)

Your indentation is not correct. Remember that haskell is whitespace
sensitive.
firstAndThird :: Parser (Char, Char)
firstAndThird = do
x <- item
item
y <- item
return (x,y)
should work.
On Mon, Nov 17, 2014 at 10:20 AM, Rohit Sharma
type Parser a = String -> [(a, String)]
Hi,
I am learning haskell and wondering why my definition of firstAndThird does not work with the do operator, however when i try to use the same using bind (firstandThird2) it works as expected. I basically want to return a tuple of first and third character of a string. Can someone please correct me what i might be overseeing?
I have pasted the same code on codetidy in case if the email lose formatting. http://codetidy.com/5726/
Many Thanks, Rohit
zero :: Parser a zero = \inp -> []
result :: a -> Parser a result x = \inp -> [(x, inp)]
item :: Parser Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]
bind :: Parser a -> (a -> Parser b) -> Parser b p `bind` f = \inp -> concat [ ((f x) inp') | (x, inp') <- p inp]
sat :: (Char -> Bool) -> Parser Char sat predicate = item `bind` (\x -> if predicate x then result x else zero )
lower :: Parser Char lower = sat (\x -> 'a' <= x && x <= 'z')
firstAndThird :: Parser (Char, Char) firstAndThird = do x <- item item y <- item return (x,y)
firstAndThird2 :: Parser (Char, Char) firstAndThird2 = item `bind` \x -> item `bind` \y -> item `bind` \z -> result (x,z)
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

Hi Rohit
It looks like you might be using the parser combinators for Graham
Hutton's book.
Note that the code in the book does not work with standard Haskell as
Graham doesn't want to clutter his presentation with "newtypes". There
is an explanation at the end of the chapter and alternative code on
the website accompanying the book that is written in standard Haskell.
Best wishes
Stephen
On 17 November 2014 15:20, Rohit Sharma
type Parser a = String -> [(a, String)]
Hi,
I am learning haskell and wondering why my definition of firstAndThird does not work with the do operator, however when i try to use the same using bind (firstandThird2) it works as expected. I basically want to return a tuple of first and third character of a string. Can someone please correct me what i might be overseeing?
I have pasted the same code on codetidy in case if the email lose formatting. http://codetidy.com/5726/
Many Thanks, Rohit
zero :: Parser a zero = \inp -> []
result :: a -> Parser a result x = \inp -> [(x, inp)]
item :: Parser Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]
bind :: Parser a -> (a -> Parser b) -> Parser b p `bind` f = \inp -> concat [ ((f x) inp') | (x, inp') <- p inp]
sat :: (Char -> Bool) -> Parser Char sat predicate = item `bind` (\x -> if predicate x then result x else zero )
lower :: Parser Char lower = sat (\x -> 'a' <= x && x <= 'z')
firstAndThird :: Parser (Char, Char) firstAndThird = do x <- item item y <- item return (x,y)
firstAndThird2 :: Parser (Char, Char) firstAndThird2 = item `bind` \x -> item `bind` \y -> item `bind` \z -> result (x,z)
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (3)
-
David McBride
-
Rohit Sharma
-
Stephen Tetley