
2008/8/6 Galchin, Vasili
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
On Wed, Aug 6, 2008 at 2:25 AM, Jeremy Shaw
wrote: At Wed, 6 Aug 2008 00:43:55 -0500, Galchin, Vasili wrote:
[1
] [1.1 ] 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