<div>Hi there,</div><div>  I'm learning haskell for weeks and I'm trying to write a parser using haskell.</div><div>  First I create a datatype:</div><div>    newtype Parser a = P (String -> [(a, String)])</div><div>  I create a function called `bind` :</div><div>    bind :: Parser a -> ( a -> Parser b) -> Parser b</div><div>    bind f g = P $ \s -> concatMap (\(a, s') -> parse (g a) s') $ parse f s</div><div>  and then:</div><div>    instance Monad Parser where</div><div>      (>>=)  = bind</div><div>  that's looks cool, than I write a function</div><div>    liftToken :: (Char -> [a]) -> Parser a</div><div>    liftToken f = P g where</div><div>      g [] = []</div><div>      g (c:cs) = f c >>= (\x -> return (x, cs))</div><div>  It works well, then I change this function to</div><div><div>    liftToken :: (Char -> [a]) -> Parser a</div><div>    liftToken f = P g where</div><div>      g [] = []</div><div>      g (c:cs) = f c `bind` (\x -> return (x, cs))</div></div><div>  GHC throw errors:</div><div>    regular.hs|153 col 14 error| • Couldn't match expected type ‘Parser t0’ with actual type ‘[a]’ • In the first argument of ‘bind’, namely ‘f c’ In the expression: f c `bind` (\ x -> return (x, cs)) In an equation for ‘g’: g (c : cs) = f c `bind` (\ x -> return (x, cs)) • Relevant bindings include f :: Char -> [a] (bound at regular.hs:151:11) liftToken :: (Char -> [a]) -> Parser a (bound at regular.hs:151:1)</div><div><br></div><div>  That's really confusing, why I can use (>>=) but I can't use `bind`? Is there any difference between them?</div>