packages feed

swish-0.2.1: Swish/HaskellUtils/FunctorM.hs

--------------------------------------------------------------------------------
--  $Id: FunctorM.hs,v 1.2 2004/01/13 17:12:08 graham Exp $
--
--  Copyright (c) 2003, G. KLYNE.  All rights reserved.
--  See end of this file for licence information.
--------------------------------------------------------------------------------
-- |
--  Module      :  FunctorM
--  Copyright   :  (c) 2003, Graham Klyne
--  License     :  GPL V2
--
--  Maintainer  :  Graham Klyne
--  Stability   :  provisional
--  Portability :  H98
--
--  This module defines a monadic functor class, that allows a monadic
--  computation to be performed, functor-style, over some container
--  structure.  The advantage of this compared with a normal functor
--  is that it allows values to be accumulated from the computation
--  (in a Monad instance) at the same time as (optionally) applying
--  transformations to each of the contained values.
--
--  Acknowledgement:  based on a message by Tomasz Zielonka sent to
--  the Haskell mailing list on 4 June 2003.
--
--------------------------------------------------------------------------------

module Swish.HaskellUtils.FunctorM
    ( FunctorM(..)
    )
where

class FunctorM t where
    fmapM  :: Monad m => (a -> m b) -> (t a -> m (t b))
    -- Try to generalise accumulating values?
    -- fmapQM :: Monad m => m b -> (b -> a -> m b) -> (t a -> m b)
    fmapM_ :: Monad m => (a -> m b) -> (t a -> m ())
    fmapM_ f t = fmapM f t >> return ()

instance FunctorM [] where
    fmapM  = mapM
    fmapM_ = mapM_

{-  Another example:

data Arc lb = Arc { asubj, apred, aobj :: lb }
    deriving (Eq, Show)

instance Functor Arc where
    fmap f (Arc s p o) = Arc (f s) (f p) (f o)

instance FunctorM Arc where
    -- fmapM :: (lb -> m l2) -> Arc lb -> m (Arc l2)
    fmapM f (Arc s p o) =
        do  { s' <- f s
            ; p' <- f p
            ; o' <- f o
            ; return $ Arc s' p' o'
            }

-}

--------------------------------------------------------------------------------
--
--  Copyright (c) 2003, G. KLYNE.  All rights reserved.
--
--  This file is part of Swish.
--
--  Swish is free software; you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation; either version 2 of the License, or
--  (at your option) any later version.
--
--  Swish is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with Swish; if not, write to:
--    The Free Software Foundation, Inc.,
--    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--
--------------------------------------------------------------------------------
-- $Source: /file/cvsdev/HaskellUtils/FunctorM.hs,v $
-- $Author: graham $
-- $Revision: 1.2 $
-- $Log: FunctorM.hs,v $
-- Revision 1.2  2004/01/13 17:12:08  graham
-- Complete functionality of AccumulateM, using functional dependencies
-- in the MonadAccum type class.
--
-- Revision 1.1  2004/01/13 12:31:24  graham
-- Move modules from HaskellRDF to HaskellUtils project
--
-- Revision 1.3  2003/09/24 18:50:52  graham
-- Revised module format to be Haddock compatible.
--
-- Revision 1.2  2003/06/12 00:49:04  graham
-- Basic query processor runs test cases OK.
-- Proof framework compiles, not yet tested.
--
-- Revision 1.1  2003/06/10 17:34:29  graham
-- Create FunctorM module
--