X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Futils%2FMaybes.lhs;h=c977494d2b5f10d38d7e73504504470f0d1ad2c0;hb=235edf36cc202bb21c00d0e5e05ebf076fb0542e;hp=f1f859a5ea3d7e60fdd5232cd54c55e1acdb4c96;hpb=2763f56de2097a34176aa883dd4f0b3de1cb896c;p=ghc-hetmet.git diff --git a/compiler/utils/Maybes.lhs b/compiler/utils/Maybes.lhs index f1f859a..c977494 100644 --- a/compiler/utils/Maybes.lhs +++ b/compiler/utils/Maybes.lhs @@ -1,57 +1,54 @@ % +% (c) The University of Glasgow 2006 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -\section[Maybes]{The `Maybe' types and associated utility functions} \begin{code} module Maybes ( - module Maybe, -- Re-export all of Maybe + module Data.Maybe, - MaybeErr(..), -- Instance of Monad - failME, isSuccess, + MaybeErr(..), -- Instance of Monad + failME, isSuccess, - orElse, - mapCatMaybes, - allMaybes, - firstJust, - expectJust, - maybeToBool, + orElse, + mapCatMaybes, + allMaybes, + firstJust, + expectJust, + maybeToBool, - thenMaybe, seqMaybe, returnMaybe, failMaybe + thenMaybe, seqMaybe, returnMaybe, failMaybe, fmapMMaybe ) where -#include "HsVersions.h" - -import Maybe - +import Data.Maybe infixr 4 `orElse` \end{code} %************************************************************************ -%* * +%* * \subsection[Maybe type]{The @Maybe@ type} -%* * +%* * %************************************************************************ \begin{code} maybeToBool :: Maybe a -> Bool maybeToBool Nothing = False -maybeToBool (Just x) = True +maybeToBool (Just _) = True \end{code} @catMaybes@ takes a list of @Maybe@s and returns a list of -the contents of all the @Just@s in it. @allMaybes@ collects +the contents of all the @Just@s in it. @allMaybes@ collects a list of @Justs@ into a single @Just@, returning @Nothing@ if there are any @Nothings@. \begin{code} allMaybes :: [Maybe a] -> Maybe [a] allMaybes [] = Just [] -allMaybes (Nothing : ms) = Nothing -allMaybes (Just x : ms) = case (allMaybes ms) of - Nothing -> Nothing - Just xs -> Just (x:xs) +allMaybes (Nothing : _) = Nothing +allMaybes (Just x : ms) = case allMaybes ms of + Nothing -> Nothing + Just xs -> Just (x:xs) \end{code} @@ -61,23 +58,23 @@ first @Just@ if there is one, or @Nothing@ otherwise. \begin{code} firstJust :: [Maybe a] -> Maybe a firstJust [] = Nothing -firstJust (Just x : ms) = Just x +firstJust (Just x : _) = Just x firstJust (Nothing : ms) = firstJust ms \end{code} \begin{code} expectJust :: String -> Maybe a -> a {-# INLINE expectJust #-} -expectJust err (Just x) = x +expectJust _ (Just x) = x expectJust err Nothing = error ("expectJust " ++ err) \end{code} \begin{code} mapCatMaybes :: (a -> Maybe b) -> [a] -> [b] -mapCatMaybes f [] = [] +mapCatMaybes _ [] = [] mapCatMaybes f (x:xs) = case f x of - Just y -> y : mapCatMaybes f xs - Nothing -> mapCatMaybes f xs + Just y -> y : mapCatMaybes f xs + Nothing -> mapCatMaybes f xs \end{code} The Maybe monad @@ -89,8 +86,8 @@ seqMaybe Nothing my = my thenMaybe :: Maybe a -> (a -> Maybe b) -> Maybe b thenMaybe ma mb = case ma of - Just x -> mb x - Nothing -> Nothing + Just x -> mb x + Nothing -> Nothing returnMaybe :: a -> Maybe a returnMaybe = Just @@ -99,15 +96,20 @@ failMaybe :: Maybe a failMaybe = Nothing orElse :: Maybe a -> a -> a -(Just x) `orElse` y = x +(Just x) `orElse` _ = x Nothing `orElse` y = y + +fmapMMaybe :: Monad m => (a -> m b) -> Maybe a -> m (Maybe b) +fmapMMaybe _ Nothing = return Nothing +fmapMMaybe f (Just x) = f x >>= \x' -> return (Just x') + \end{code} %************************************************************************ -%* * +%* * \subsection[MaybeErr type]{The @MaybeErr@ type} -%* * +%* * %************************************************************************ \begin{code} @@ -116,7 +118,7 @@ data MaybeErr err val = Succeeded val | Failed err instance Monad (MaybeErr err) where return v = Succeeded v Succeeded v >>= k = k v - Failed e >>= k = Failed e + Failed e >>= _ = Failed e isSuccess :: MaybeErr err val -> Bool isSuccess (Succeeded {}) = True