
On Thu, Feb 13, 2003 at 01:21:35PM -0500, Dean Herington wrote:
Here's another way to sugar if-then-else that works like C's ?: and Lisp's cond:
import Monad (liftM3) import Directory (doesFileExist, doesDirectoryExist)
infix 1 ?, ??
(?) :: Bool -> a -> a -> a (c ? t) e = if c then t else e
(??) :: (Monad m) => m Bool -> m a -> m a -> m a (??) = liftM3 (?)
main = do print $ 1>2 ? 1 $ 2 print =<< fileType "foo"
fileType :: String -> IO String fileType name = doesDirectoryExist name ?? return "dir" $ doesFileExist name ?? return "file" $ return "nothing"
That's pretty nice (although not quite as nice as it would be to be able to use real ifs with no extra parentheses). Any idea how to do something like this with a case? I imagine it's considerably harder, since case statements do pattern matching, which is rather heavy duty syntactic sugar. I often have functions like mp <- fun case mp of Nothing -> deal with error Just p -> do something with p where it would be much nicer to be able to just use caseM fun of Nothing -> deal with error Just p -> do something with p which would avoid confusion when reading the code as to whether the value mp may be used later in the function. Any ideas how to do something like this? -- David Roundy http://civet.berkeley.edu/droundy/