[Haskell-beginners] EitherT

鲍凯文 traqueofziche at gmail.com
Thu Apr 12 16:40:53 UTC 2018


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 at haskell.org> wrote:

> Send Beginners mailing list submissions to
>         beginners at 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 at haskell.org
>
> You can reach the person managing the list at
>         beginners-owner at 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 at yahoo.co.uk>
> To: The Haskell-Beginners Mailing List - Discussion of primarily
>         beginner-level topics related to Haskell <beginners at haskell.org>
> Subject: [Haskell-beginners] EitherT
> Message-ID: <57AFC9F5-3601-4D18-B860-41352D3F2204 at 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 at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> ------------------------------
>
> End of Beginners Digest, Vol 118, Issue 6
> *****************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20180412/e78207cb/attachment.html>


More information about the Beginners mailing list