[Haskell-beginners] Bind parser returning wrong return type

Rohit Sharma rohits79 at gmail.com
Sat Nov 15 12:10:55 UTC 2014

Hi All,

Sorry if this is a very lame question but i am a beginner and much
appreciate if some one could correct me?

I am reading haskell book and curious why the return type of the bind
operator look odd to me

For the given definitions

*    type Parser a = String -> [(a, String)]*

*    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]*

when I define z in GHCI as

*    let z = item `bind` (\x -> (\y -> result (x,y))) "Rohit"*

the return type is

*    >> :t z*
*    z :: Parser ([Char], Char)*

(1) Shouldn't the return type of (Char, [Char])? looking at the list
comprehension, "(x, inp') <- p inp" should yield -> "('r', "ohit")". Next f
x inp' is left associative, so f x should yield character 'r' and pass to
the lambda that should return result tuple ('r', "ohit"), but why is it
that z type is ([Char], char) :: (x,y)

(2) How can i print the value of z in the above case on the ghci

Many thanks,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20141115/e800c2b9/attachment.html>

More information about the Beginners mailing list