<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">I went back and tried to convert the YAHT example to Monad, importing Monad, commenting out all but the data descriptions and the searchAll function, and finally replacing success, failure, augment, and combine in the searchAll function with return, fail, &gt;&gt;=, and mplus.<br><br>*Main&gt; let g = Graph [(1,'a'),(2,'b'),(3,'c'),(4,'d')] [(1,2,'p'),(2,3,'q'),(1,4,'r'),(4,3,'s')]<br>*Main&gt; searchAll g 1 3 :: [[Int]]<br>[[1,2,3],[1,4,3]]<br>*Main&gt; searchAll g 1 3 :: Maybe [Int]<br>Just [1,2,3]<br>*Main&gt; searchAll g 3 1 :: Maybe [Int]<br>Nothing<br>*Main&gt; searchAll g 3 1 :: [[Int]]<br>[]<br><br><br>All good so far, but then tried to convert Failable from Computation to Monad<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>&nbsp;<br><br>and got the following error.<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:34:4: parse error on input `&gt;&gt;='<br>Failed, modules loaded: none.<br>Prelude&gt;<br><br><br>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></table><br>