bracketOnError, while, forever
thjaeger at gmail.com
Tue Feb 8 07:33:13 EST 2005
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.
| -- 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
What do you think?
More information about the Libraries