<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Oh I wasn't clear -- you need multiple instance declarations for a given type (Failable, for example), one for each type class you're implementing.<div><br></div><div>That is,&nbsp;</div><div><br></div><div>instance Monad Failable where</div><div>&nbsp;&nbsp; return = ...</div><div>&nbsp;&nbsp; ...</div><div><br></div><div><br></div><div>instance MonadPlus Failable where</div><div>&nbsp;&nbsp; mplus = ...</div><div>&nbsp;&nbsp; ...</div><div><br></div><div>-Ross</div><div><br></div><div><div><div>On Jun 1, 2009, at 9:40 PM, michael rice wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="top" style="font: inherit;">Hi Ross,<br><br>I thought of that, but return, fail, and &gt;&gt;= became "not visible" when I changed the instance declaration from Monad to MonadPlus.. Can Failable be in two instance declarations, one for Monad (giving it return, fail, and &gt;&gt;=) and one for MonadPlus (giving it mplus)?<br><br>Michael<br><br>--- On <b>Mon, 6/1/09, Ross Mellgren <i>&lt;<a href="mailto:rmm-haskell@z.odi.ac">rmm-haskell@z.odi.ac</a>&gt;</i></b> wrote:<br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Ross Mellgren &lt;<a href="mailto:rmm-haskell@z.odi.ac">rmm-haskell@z.odi.ac</a>&gt;<br>Subject: Re: [Haskell-cafe] Missing a "Deriving"?<br>To: "michael rice" &lt;<a href="mailto:nowgate@yahoo.com">nowgate@yahoo.com</a>&gt;<br>Cc: "haskell-cafe Cafe" &lt;<a href="mailto:haskell-cafe@haskell.org">haskell-cafe@haskell.org</a>&gt;<br>Date: Monday, June 1, 2009, 9:33 PM<br><br><div id="yiv1714632642">mplus is a method of class MonadPlus, so you need to write it in a separate instance from the one for Monad, e.g.<div><br></div><div>instance MonadPlus Failable where</div><div>&nbsp;&nbsp; &nbsp;mplus = ...</div><div><br></div><div>-Ross</div><div><br></div><div><div><div><div>On Jun 1, 2009, at 9:28 PM, michael rice wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit; -x-system-font: none;" valign="top">Still stumped. Maybe and [] are in the same MonadPlus monad, but how do I make monad Failable understand mplus?<br><br>I'm now getting this error upon loading:<br><br><br>Prelude&gt; :l graph5<br>[1 of 1] Compiling Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( graph5.hs, interpreted )<br><br>graph5.hs:36:4: `mplus' is not a (visible) method of class `Monad'<br>Failed, modules loaded: none.<br>Prelude&gt; <br><br><br><br><blockquote style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><div id="yiv778184410"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-size: inherit; line-height: inherit; font-size-adjust: inherit; font-stretch: inherit;" valign="top">Complete code follows.<br><br>Michael<br><br>=========================<br><br>import Monad<br><br>data Failable a = Success a | Fail String deriving (Show)<br><br>data Graph v e = Graph [(Int,v)] [(Int,Int,e)]<br><br>{-<br>class Computation c where<br>&nbsp;&nbsp;&nbsp; success :: a -&gt; c a<br>&nbsp;&nbsp;&nbsp; failure :: String -&gt; c a<br>&nbsp;&nbsp;&nbsp; augment :: c a -&gt; (a -&gt; c b) -&gt; c b<br>&nbsp;&nbsp;&nbsp; combine :: c a -&gt; c a -&gt; c a<br><br>instance Computation Maybe where<br>&nbsp;&nbsp;&nbsp; success = Just<br>&nbsp;&nbsp;&nbsp; failure = const Nothing<br>&nbsp;&nbsp;&nbsp; augment (Just x) f = f x<br>&nbsp;&nbsp;&nbsp; augment Nothing _ = Nothing<br>&nbsp;&nbsp;&nbsp; combine Nothing y = y<br>&nbsp;&nbsp;&nbsp; combine x _ = x<br><br>instance Computation Failable where<br>&nbsp;&nbsp;&nbsp; success = Success<br>&nbsp;&nbsp;&nbsp; failure = Fail<br>&nbsp;&nbsp;&nbsp; augment (Success x) f = f x<br>&nbsp;&nbsp;&nbsp; augment (Fail s) _ = Fail s<br>&nbsp;&nbsp;&nbsp; combine (Fail _) y = y<br>&nbsp;&nbsp;&nbsp; combine x _ = x<br>-}<br><br>instance Monad Failable where<br>&nbsp;&nbsp;&nbsp; return = Success<br>&nbsp;&nbsp;&nbsp; fail = Fail<br>&nbsp;&nbsp;&nbsp; (&gt;&gt;=) (Success x) f = f x<br>&nbsp;&nbsp;&nbsp; (&gt;&gt;=) (Fail s) _ = Fail s<br>&nbsp;&nbsp;&nbsp; mplus (Fail _) y = y<br>&nbsp;&nbsp;&nbsp; mplus x _ = x<br><br>{-<br>instance Computation [] where<br>&nbsp;&nbsp;&nbsp; success a = [a]<br>&nbsp;&nbsp;&nbsp; failure = const []<br>&nbsp;&nbsp;&nbsp; augment l f = concat (map f l)<br>&nbsp;&nbsp;&nbsp; combine = (++)<br><br><br>searchAll g@(Graph vl el) src dst<br>&nbsp;&nbsp;&nbsp; | src == dst = success [src]<br>&nbsp;&nbsp;&nbsp; | otherwise = search' el<br>&nbsp;&nbsp;&nbsp; where search' [] = failure "no path"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; search' ((u,v,_):es)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | src == u = (searchAll g v dst `augment`<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (success . (u:)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `combine` search' es<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise = search' es<br>-}<br><br>searchAll g@(Graph vl el) src dst<br>&nbsp;&nbsp;&nbsp; | src == dst = return [src]<br>&nbsp;&nbsp;&nbsp; | otherwise = search' el<br>&nbsp;&nbsp;&nbsp; where search' [] = fail "no path"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; search' ((u,v,_):es)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | src == u = (searchAll g v dst &gt;&gt;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (return . (u:)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `mplus` search' es<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise = search' es<br>&nbsp;</td></tr></tbody></table><br>       </div><br>-----Inline Attachment Follows-----<br><br><div class="plainMail">_______________________________________________<br>Haskell-Cafe mailing list<br><a rel="nofollow">Haskell-Cafe@haskell.org</a><br><a rel="nofollow" target="_blank" href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br></div></blockquote></td></tr></tbody></table><br>       _______________________________________________<br>Haskell-Cafe mailing list<br><a rel="nofollow" ymailto="mailto:Haskell-Cafe@haskell.org" target="_blank" href="/mc/compose?to=Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br></blockquote></div><br></div></div></div></blockquote></td></tr></tbody></table><br>       </blockquote></div><br></div></body></html>