[Haskell-cafe] Missing a "Deriving"?

michael rice nowgate at yahoo.com
Mon Jun 1 22:03:08 EDT 2009


I didn't know I could do that. Works fine. Output below. Thanks!

This is some pretty neat stuff, and I've only scratched the surface.

Michael

===================

[michael at localhost ~]$ ghci
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l graph5
[1 of 1] Compiling Main             ( graph5.hs, interpreted )

graph5.hs:37:9:
    Warning: No explicit method nor default method for `mzero'
    In the instance declaration for `MonadPlus Failable'
Ok, modules loaded: Main.
*Main> let g = Graph [(1,'a'),(2,'b'),(3,'c'),(4,'d')] [(1,2,'p'),(2,3,'q'),(1,4,'r'),(4,3,'s')]
*Main> searchAll g 1 3 :: Failable [Int]
Success [1,2,3]
*Main> searchAll g 3 1 :: Failable [Int]
Fail "no path"
*Main> searchAll g 1 3 :: Maybe [Int]
Just [1,2,3]
*Main> searchAll g 3 1 :: Maybe [Int]
Nothing
*Main> searchAll g 1 3 :: [[Int]]
[[1,2,3],[1,4,3]]
*Main> searchAll g 3 1 :: [[Int]]
[]
*Main> 



--- On Mon, 6/1/09, Ross Mellgren <rmm-haskell at z.odi.ac> wrote:

From: Ross Mellgren <rmm-haskell at z.odi.ac>
Subject: Re: [Haskell-cafe] Missing a "Deriving"?
To: "michael rice" <nowgate at yahoo.com>
Cc: "haskell-cafe Cafe" <haskell-cafe at haskell.org>
Date: Monday, June 1, 2009, 9:43 PM

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.
That is, 
instance Monad Failable where   return = ...   ...

instance MonadPlus Failable where   mplus = ...   ...
-Ross
On Jun 1, 2009, at 9:40 PM, michael rice wrote:
Hi Ross,

I thought of that, but return, fail, and >>= 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 >>=) and one for MonadPlus (giving it mplus)?

Michael

--- On Mon, 6/1/09, Ross Mellgren <rmm-haskell at z.odi.ac> wrote:

From: Ross Mellgren <rmm-haskell at z.odi.ac>
Subject: Re: [Haskell-cafe] Missing a "Deriving"?
To: "michael rice" <nowgate at yahoo.com>
Cc: "haskell-cafe Cafe" <haskell-cafe at haskell.org>
Date: Monday, June 1, 2009, 9:33 PM

mplus is a method of class MonadPlus, so you need to write it in a separate instance from the one for Monad, e.g.
instance MonadPlus Failable where    mplus = ...
-Ross
On Jun 1, 2009, at 9:28 PM, michael rice wrote:
Still stumped. Maybe and [] are in the same MonadPlus monad, but how do I make monad Failable understand mplus?

I'm now getting this error upon loading:


Prelude> :l graph5
[1 of 1] Compiling Main             ( graph5.hs, interpreted )

graph5.hs:36:4: `mplus' is not a (visible) method of class `Monad'
Failed, modules loaded: none.
Prelude> 



Complete code follows.

Michael

=========================

import Monad

data Failable a = Success a | Fail String deriving (Show)

data Graph v e = Graph [(Int,v)] [(Int,Int,e)]

{-
class Computation c where
    success :: a -> c a
    failure :: String -> c a
    augment :: c a -> (a -> c b) -> c b
    combine :: c a -> c a -> c a

instance Computation Maybe where
    success = Just
    failure = const Nothing
    augment (Just x) f = f x
    augment Nothing _ = Nothing
    combine Nothing y = y
    combine x _ = x

instance Computation Failable where
    success = Success
    failure = Fail
    augment (Success x) f = f x
    augment (Fail s) _ = Fail s
    combine (Fail _) y = y
    combine x _ = x
-}

instance Monad Failable where
    return = Success
    fail = Fail
    (>>=) (Success x) f = f x
    (>>=) (Fail s) _ = Fail s
    mplus (Fail _) y = y
    mplus x _ = x

{-
instance Computation [] where
    success a = [a]
    failure = const []
    augment l f = concat (map f l)
    combine = (++)


searchAll g@(Graph vl el) src dst
    | src == dst = success [src]
    | otherwise = search' el
    where search' [] = failure "no path"
          search' ((u,v,_):es)
              | src == u = (searchAll g v dst `augment`
                             (success . (u:)))
                            `combine` search' es
              | otherwise = search' es
-}

searchAll g@(Graph vl el) src dst
    | src == dst = return [src]
    | otherwise = search' el
    where search' [] = fail "no path"
          search' ((u,v,_):es)
              | src == u = (searchAll g v dst >>=
                             (return . (u:)))
                            `mplus` search' es
              | otherwise = search' es
 
       
-----Inline Attachment Follows-----

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe at haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

       _______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe at haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


       



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090601/6ae3cae3/attachment-0001.html


More information about the Haskell-Cafe mailing list