Now: if I have a couple of thousand of these Instances, created with the same Attributes value, as in: a = Attributes ["a","bc"] i0000 = Instance a [1,2] i0001 = Instance a [1,1] ... i7896 = Instance a [2,1] can I be assured that there are not thousands of actual copies of a but that they simply have a pointer to a ? I'm interested in the answer for both ghc (compiled/interpreted) as interpreted Hugs. Yes for GHC: you'll only get one copy of 'a'. Simon
MessageThanks ! Now, a small follow-up question: if I subsequently test 2 Instances whether they were instantiated with the same Attributes value, as in test (Instance a1 _) (Instance a2 _) = (a1==a2) will this be implemented efficiently ? I.e. will it check first whether the pointers happen to be the same, and only then do a full Eq comparison ? Cheers Frank ----- Original Message ----- From: Simon Peyton-Jones To: Frank Dellaert ; Haskell@haskell.org Sent: Monday, December 17, 2001 10:24 AM Subject: RE: space efficiency question Now: if I have a couple of thousand of these Instances, created with the same Attributes value, as in: a = Attributes ["a","bc"] i0000 = Instance a [1,2] i0001 = Instance a [1,1] ... i7896 = Instance a [2,1] can I be assured that there are not thousands of actual copies of a but that they simply have a pointer to a ? I'm interested in the answer for both ghc (compiled/interpreted) as interpreted Hugs. Yes for GHC: you'll only get one copy of 'a'. Simon
Frank Dellaert asks:
test (Instance a1 _) (Instance a2 _) = (a1==a2)
will this be implemented efficiently ? I.e. will it check first whether the > pointers happen to be the same, and only then do a full Eq comparison ?
No, otherwise you might also expect that the following test' function: test' :: String -> Bool test' s = (s==s) always returns True, without considering its actual argument s. But this is not the way of it, (==) evaluates the two strings to be compared as far as necessary for this comparison. For example: test' "abc" = True but: test' undefined = undefined If you really need something like pointer equality, you might want to consider the stable names of: @inproceedings{ jones99stretching, author = "Simon L. Peyton Jones and Simon Marlow and Conal Elliott", title = "Stretching the Storage Manager: Weak Pointers and Stable Names in Haskell", booktitle = "Implementation of Functional Languages", pages = "37-58", year = "1999", url = "citeseer.nj.nec.com/jones99stretching.html" } -- Janis Voigtlaender http://wwwtcs.inf.tu-dresden.de/~voigt/ mailto:voigt@tcs.inf.tu-dresden.de
participants (3)
-
Frank Dellaert -
Janis Voigtlaender -
Simon Peyton-Jones