
Hi, speaking of additions to the libraries, i'd like to mention a few functions from http://haskell.org/hawiki/LicensedPreludeExts that I think deserve to be in the libs. First of all | -- Cale Gibbard | comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering | comparing p x y = compare (p x) (p y) fits nicely with the ...By functions from Data.List. Since there's no easy way to catch failure of read operations, | readM :: (Monad m, Read a) => String -> m a | readM s = case [x | (x,t) <- reads s, ("","") <- lex t] of | [x] -> return x | [] -> fail "Prelude.readM: no parse" | _ -> fail "Prelude.readM: ambiguous parse" this function seems to be quite natural. Finally, | -- Koen Claessen | selections :: [a] -> [(a,[a])] | selections [] = [] | selections (x:xs) = (x,xs) : [ (y,x:ys) | (y,ys) <- selections xs ] | | permutations :: [a] -> [[a]] | permutations [] = [[]] | permutations xs = | [ y : zs | | (y,ys) <- selections xs | , zs <- permutations ys | ] are quite useful (maybe they should be named select and permute since most Data.List names seem to be imperatives).
forever :: (Monad m) => m a -> m () forever f = while (return True) f a more logical name would be repeatM_
Btw, is there some rule which prelude functions should have monadic equivalents in Control.Monad? There is mapM, filterM, zipWithM, foldM and replicateM, but no foldrM, unfoldM, repeatM, allM, anyM (the last three are easily defined using sequence, but so are mapM and replicateM). What do you think? Thomas