Confusing `bind` and (>>=)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Confusing `bind` and (>>=)

mirone
Hi there,
  I'm learning haskell for weeks and I'm trying to write a parser using haskell.
  First I create a datatype:
    newtype Parser a = P (String -> [(a, String)])
  I create a function called `bind` :
    bind :: Parser a -> ( a -> Parser b) -> Parser b
    bind f g = P $ \s -> concatMap (\(a, s') -> parse (g a) s') $ parse f s
  and then:
    instance Monad Parser where
      (>>=)  = bind
  that's looks cool, than I write a function
    liftToken :: (Char -> [a]) -> Parser a
    liftToken f = P g where
      g [] = []
      g (c:cs) = f c >>= (\x -> return (x, cs))
  It works well, then I change this function to
    liftToken :: (Char -> [a]) -> Parser a
    liftToken f = P g where
      g [] = []
      g (c:cs) = f c `bind` (\x -> return (x, cs))
  GHC throw errors:
    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)

  That's really confusing, why I can use (>>=) but I can't use `bind`? Is there any difference between them?

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
Reply | Threaded
Open this post in threaded view
|

Re: Confusing `bind` and (>>=)

Ivan Lazar Miljenovic
On 10 October 2017 at 22:34, mirone <[hidden email]> wrote:

> Hi there,
>   I'm learning haskell for weeks and I'm trying to write a parser using
> haskell.
>   First I create a datatype:
>     newtype Parser a = P (String -> [(a, String)])
>   I create a function called `bind` :
>     bind :: Parser a -> ( a -> Parser b) -> Parser b
>     bind f g = P $ \s -> concatMap (\(a, s') -> parse (g a) s') $ parse f s
>   and then:
>     instance Monad Parser where
>       (>>=)  = bind
>   that's looks cool, than I write a function
>     liftToken :: (Char -> [a]) -> Parser a
>     liftToken f = P g where
>       g [] = []
>       g (c:cs) = f c >>= (\x -> return (x, cs))

Here, f c :: [a], so you're using the [] instance of Monad, hence
(>>=) :: [a] -> (a -> [b]) -> [b]

>   It works well, then I change this function to
>     liftToken :: (Char -> [a]) -> Parser a
>     liftToken f = P g where
>       g [] = []
>       g (c:cs) = f c `bind` (\x -> return (x, cs))
>   GHC throw errors:
>     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)
>
>   That's really confusing, why I can use (>>=) but I can't use `bind`? Is
> there any difference between them?
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.



--
Ivan Lazar Miljenovic
[hidden email]
http://IvanMiljenovic.wordpress.com
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
Reply | Threaded
Open this post in threaded view
|

Re: Confusing `bind` and (>>=)

jpaugh


On October 10, 2017 6:43:41 AM CDT, Ivan Lazar Miljenovic <[hidden email]> wrote:

>On 10 October 2017 at 22:34, mirone <[hidden email]> wrote:
>> Hi there,
>>   I'm learning haskell for weeks and I'm trying to write a parser
>using
>> haskell.
>>   First I create a datatype:
>>     newtype Parser a = P (String -> [(a, String)])
>>   I create a function called `bind` :
>>     bind :: Parser a -> ( a -> Parser b) -> Parser b
>>     bind f g = P $ \s -> concatMap (\(a, s') -> parse (g a) s') $
>parse f s
>>   and then:
>>     instance Monad Parser where
>>       (>>=)  = bind
>>   that's looks cool, than I write a function
>>     liftToken :: (Char -> [a]) -> Parser a
>>     liftToken f = P g where
>>       g [] = []
>>       g (c:cs) = f c >>= (\x -> return (x, cs))
>
>Here, f c :: [a], so you're using the [] instance of Monad, hence
>(>>=) :: [a] -> (a -> [b]) -> [b]

Yep, and >>= for [a] will often have different semantics then whatever monad you had in mind. You can inject the list into the parser monad by using return.

    return (f c) `bind` (\x -> return (x, cs))

>
>>   It works well, then I change this function to
>>     liftToken :: (Char -> [a]) -> Parser a
>>     liftToken f = P g where
>>       g [] = []
>>       g (c:cs) = f c `bind` (\x -> return (x, cs))
>>   GHC throw errors:
>>     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)
>>
>>   That's really confusing, why I can use (>>=) but I can't use
>`bind`? Is
>> there any difference between them?
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>> Only members subscribed via the mailman list are allowed to post.
>
>
>
>--
>Ivan Lazar Miljenovic
>[hidden email]
>http://IvanMiljenovic.wordpress.com
>_______________________________________________
>Haskell-Cafe mailing list
>To (un)subscribe, modify options or view archives go to:
>http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>Only members subscribed via the mailman list are allowed to post.

--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.