Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1.  EitherT (mike h)


----------------------------------------------------------------------

Message: 1
Date: Thu, 12 Apr 2018 11:25:57 +0100
From: mike h <mike_k_hough...@yahoo.co.uk>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: [Haskell-beginners] EitherT
Message-ID: <57afc9f5-3601-4d18-b860-41352d3f2...@yahoo.co.uk>
Content-Type: text/plain; charset=utf-8

Hi,
I’m trying to write EitherT from first principles and I’m stuck at the first 
hurdle - Functor.  I’m looking for a hint rather than a complete answer :) 


This is what I have

newtype EitherT m a b = EitherT {runEitherT :: m (Either a b)}
instance Monad m => Functor (EitherT m a) where
    ---- fmap :: (a -> b) -> f a -> f b
    fmap f m = EitherT $ do
        mv <- runEitherT m
        case mv of
            Left _   -> return mv
            Right rv -> return $ Right (f rv)



and here is the compilers view
Phrase.hs:31:25: error:
    • Couldn't match type ‘b’ with ‘a1’
      ‘b’ is a rigid type variable bound by
        the type signature for:
          fmap :: forall a1 b. (a1 -> b) -> EitherT m a a1 -> EitherT m a b
        at Phrase.hs:27:5-8
      ‘a1’ is a rigid type variable bound by
        the type signature for:
          fmap :: forall a1 b. (a1 -> b) -> EitherT m a a1 -> EitherT m a b
        at Phrase.hs:27:5-8
      Expected type: m (Either a a1)
        Actual type: m (Either a b)
    • In the expression: return $ Right (f rv)
      In a case alternative: Right rv -> return $ Right (f rv)
      In a stmt of a 'do' block:
        case mv of
          Left _ -> return mv
          Right rv -> return $ Right (f rv)
    • Relevant bindings include
        rv :: a1 (bound at Phrase.hs:31:19)
        mv :: Either a a1 (bound at Phrase.hs:28:9)
        m :: EitherT m a a1 (bound at Phrase.hs:27:12)
        f :: a1 -> b (bound at Phrase.hs:27:10)
        fmap :: (a1 -> b) -> EitherT m a a1 -> EitherT m a b
          (bound at Phrase.hs:27:5)
   

what I think I need to do is fmap over the right value after pulling if out of 
the monad m by doing   mv <- runEitherT m

these lines from the compiler are particularly confusing 
      Expected type: m (Either a a1)
        Actual type: m (Either a b)

as I believe f is    f:: a1->b 

So just hints please and I expect I’ll have another duh moment. 

Thanks

Mike





------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 118, Issue 6
*****************************************

Reply via email to