Hi Jeremy and the haskell community,
I think now my question is why isn't there a higher-order "with" function in the Haskell Prelude?
There is. Well, not in the prelude, but in the base package at least. It's called "bracket". But I think the reason that not all "with" functions are implemented with bracket is because "with" is not as well defined as a function; it is an idiom, and varies in too many ways to have a well-defined semantics.
However, you could presumably abstract this more using typeclasses with fundeps or associated types.
class Resource a where
type Constr a
acquire :: Constr a -> IO a
release :: a -> IO ()
with :: (Resource a) => Constr a -> (a -> IO b) -> IO b
with constr = bracket (acquire constr) release
I haven't calculated how many of the existing with* functions would fit into this abstraction.
Luke
Regards, Vasili
At Wed, 6 Aug 2008 00:43:55 -0500,
Galchin, Vasili wrote:
>
> [1 <multipart/alternative (7bit)>]
> [1.1 <text/plain; ISO-8859-1 (7bit)>]
> Hello,
>
> 1) Is there a common assumed semantics across all of the Haskell "with"
> things? withString? withData?
A vague semantic is that some resource is acquired, used, and then released.
> 2) If the answer to 1) is yes, then does this imply some kind of
> polymorphism? Couldn't "with" be "reduced" to a higher order function then
> ??
I think Control.Exception.bracket is used to implement many, but not
all, of the with* functions.
> newThing :: IO a
> newThing = ...
> destroyThing :: a -> IO b
> destroyThing ...
> withThing :: (Thing -> IO a) -> IO a
> withThing useThing = bracket newThing destroyThing useThing
I have not fully answered either of your questions, but hopefully this
is a start.
j.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe