[Haskell-cafe] where to put general-purpose utility functions
Joey Hess
joey at kitenet.net
Mon Jan 23 22:01:58 CET 2012
David Fox wrote:
> I try to create a workflow for this sort of thing. I create a package
> with a name like set-extra, with one module Data.Set.Extra and an
> alternative Data.Set module that exports both the old Data.Set and the
> symbols in Data.Set.Extra. Then I email the maintainers of the
> Containers package with a suggestion. After a while I upload
> set-extra to hackage if I need to use set-extra in another hackage
> package.
Thanks, that's the most helpful hint.
It matches MissingH's use of .Utils modules too.
Jean-Marie Gaillourdet wrote:
> Personally, I've always been avoiding those grab-bags of functionality like
> MissingH and other libraries. Not because I think they don't provide anything
> useful. But, because their level of maintenance is not clear to me. A rather
> large library of utility functions tends to need many dependencies on other
> hackage packages. That makes the question of maintenance even more important.
It's not clear to me either. I used MissingH starting out because I
personally know and trust John and/or he cowrote RWH.
Don't know that I would have otherwise.
(And I only use Data.String.Utils, System.Cmd.Utils, and Data.Bits.Utils
from it.)
> As others have pointed out some of your functions may already exist in some
> widely used package. And other might be easy to be replaced by some idiom. Don't
> underestimate the depth of Haskell and it's well thought libraries. I am
> regularly amazed by finding some new way to combine seemingly trivial functions
> to do some non-trivial task. Every time that happens I can remove some of my
> utility functions.
Well, this is certianly true, on the other hand then you end up with a
pattern of repeatedly combining some trivial functions in a certian way,
and it then makes sense to formalize that. It's better to have `fromMaybe`
than to repeatedly use `id` with `maybe`.
Tristan Ravitch wrote:
> > whenM :: Monad m => m Bool -> m () -> m () -- also >>?
> > unlessM :: Monad m => m Bool -> m () -> m () -- also >>!
> > firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
>
> IfElse (http://hackage.haskell.org/packages/archive/IfElse/0.85/doc/html/Control-Monad-IfElse.html)
> has a few of these.
whenM is in a dozen packages, the others fewer but scattered here and
there. I also found >>? and >>! somewhere on hackage once but not sure
where.
> > Various path manipulation functions such as:
> > absPath :: FilePath -> IO FilePath
>
> Is this different from canonicalizePath in directory?
Yes; it doesn't require the path to exist.
> > Other stuff:
> >
> > separate :: (a -> Bool) -> [a] -> ([a], [a])
>
> Is this partition from Data.List?
No; it's like break but does not include the separating character in the
snd list.
> > format :: Format -> Variables -> String
>
> This looks like it might be similar to HStringTemplate
This particular format allows for things like "${foo} ${bar;10} ${baz;-10}\n"
so it's sort of printf like, but not entirely.
> > withTempFile :: Template -> (FilePath -> Handle -> IO a) -> IO a
>
> temporary (http://hackage.haskell.org/packages/archive/temporary/1.1.2.3/doc/html/System-IO-Temp.html)
> has a few variants of this one
Indeed, however all its functions can fail if getTemporaryDirectory
fails; this one puts the temp file in "." in that case.
Simon Hengel wrote:
> > headMaybe :: [a] -> Maybe a
>
> Is this the same as Data.Maybe.maybeToList?
Rather listToMaybe.. it is the same as that in fact.
Though I also have a lastMaybe that does not have an equivilant in Data.Maybe.
> > readMaybe :: Read a => String -> Maybe a
>
> This has been added to base recently [1].
Great! Although there are multiple ways to choose to implement this.
I found it useful to make it succeed even if not all the string was
consumed, or when there are multiple valid results. I've renamed
mine readish.
--
eee shy jo
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 828 bytes
Desc: Digital signature
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120123/d66b8cfb/attachment.pgp>
More information about the Haskell-Cafe
mailing list