[Haskell-beginners] Ambiguous type of WriterT result I am not using

Martin Vlk martin at vlkk.cz
Sat Nov 21 20:09:44 UTC 2015


David, Kim-Ee, thank you both very much - this really helped make my
code good looking!

Martin

Kim-Ee Yeoh:
> Hi Martin,
> 
>     But the compiler complains about ambiguous type for the writer reult I
>     am ignoring (message in the above lpaste).
> 
> 
> There are a number of types going on here, and the one that's ambiguous
> is the monoid w in WriterT w m a.
>  
> 
>     Normally I think the way around this is to provide explicit type
>     annotation for "foldIt", but in this case the result type depends on the
>     type of "a" in foldrEntries type and I don't know how to express this
>     and make the compiler happy.
> 
>  
> David's ScopedTypeVariables solution is perfectly cromulent. Here's
> another one without any pragmas:
> 
> foldrEntries ::
>       (Entry -> a -> a)
>    -> a
>    -> (String -> a)
>    -> Entries
>    -> a
> foldrEntries next done fail' =
>    isoR . foldrEntriesW (isoL .: next) (isoL done) (isoL . fail')
>    where
>    isoL :: a -> WriterT () Identity a
>    isoL = return
>    isoR :: WriterT () Identity a -> a
>    isoR = fst . runIdentity . runWriterT
> 
> The (.:) is from Data.Composition.
> 
> The isoL and isoR witness the isomorphism, and foldrEntries is written
> in a point-minimized form that makes it transparent that it's a
> specialization of foldrEntriesW.
> 
> Do eschew verbosities like "return . fst =<< runWriterT". (Hlint should
> be programmed to catch this. It doesn't yet.) A return that's too near a
> monadic bind sets off alarms among professional haskell engineers.
>  
> 
>     (I was able to make it work by calling "tell ()", basically writing a
>     dummy value, which lets compiler know what the type is, but this is not
>     so good - I don't want to make artificial function calls like this.)
> 
> 
> Good call.
> 
> -- Kim-Ee
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> 


More information about the Beginners mailing list