Hi,

Try to unify the types returned by each of the case alternatives, starting from what the compiler has inferred so far.

I’ve made this mistake many times lol.

Best,

toz 

On Thu, Apr 12, 2018 at 5:38 AM <beginners-request@haskell.org> wrote:
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-request@haskell.org

You can reach the person managing the list at
        beginners-owner@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_houghton@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-41352D3F2204@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
*****************************************