On Mon, 1 Sep 2008, Ashley Yakeley wrote:

Ganesh Sittampalam wrote:
Right, but they might be the same package version, if one is a dynamically loaded bit of code and the other isn't.

OK. It's up to the dynamic loader to deal with this, and make sure that initialisers are not run more than once when it loads the package into the RTS. The scopes and names are all well-defined. How hard is this?

I have a feeling it might be non-trivial; the dynamically loaded bit of code will need a separate copy of the module in question, since it might be loaded into something where the module is not already present. So it'll have a separate copy of the global variable in a separate location, and the dynamic loader needs to arrange to do something weird, like copying the value of the first run <- to the second one instead of running it again.


My question was actually about what happens with some different library that needs <-; how do we know whether having two <-s is safe or not?

I don't understand. When is it not safe?

Well, the safety of <- being run twice in the Data.Unique case is based around the two different Data.Unique types not being compatible. Let's suppose some other module uses a <-, but returns things based on that <- that are some standard type, rather than a type it defines itself. Is module duplication still safe?

No, it seems like the right way to do introspection to me, rather than adding some new mechanism for describing a datatype as your paper
suggests.

Aesthetic arguments are always difficult. The best I can say is, why are some classes blessed with a special language-specified behaviour?

Well, let me put it this way; since I don't like <-, and I don't particularly mind Typeable, I wouldn't accept IOWitness as an example of something that requires <- to implement correctly, because I don't see any compelling feature that you can only implement with <-.

We could arrange for the class member of Typeable to be called "unsafe...".

We could, but it's not actually unsafe to call as such. It's only unsafe to implement.

That's fine, it can export a non-class member without the unsafe prefix.

And if we're going the implicit contract route, we have to resort to unsafe functions to do type representation. It's not necessary, and seems rather against the spirit of Haskell.

Time was when people would insist that unsafePerformIO wasn't Haskell, though perhaps useful for debugging. Now we have all these little unsafe things because people think they're necessary, and there's an implicit contract forced on the user not to be unsafe. But it turns out that they're not necessary.

There's some unsafety somewhere in both Typeable and IOWitnesses, and in both cases it can be completely hidden from the user - with Typeable, just don't let the user define the typeOf function at all themselves. I'm not actually sure why it is exposed; is it necessary for some use pattern?

I don't see what the point of multiple values is, I'm afraid. A single instance of Typeable is fine for doing type equality tests.

Sometimes you want to do witness equality tests rather than type equality tests. For instance, I might have a "foo" exception and a "bar" exception, both of which carry an Int. Rather than create new Foo and Bar types, I can just create a new witness for each.

This is precisely what newtype is designed for, IMO. We don't need another mechanism to handle it.

Cheers,

Ganesh
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to