I seem to recall reading somewhere that an object's StableName can change when it becomes evaluated; so it's possible you aren't detecting sharing because of this.
You might try this instead: > mkStableName' a = mkStableName $! a This forces the object to become evaluated before calling mkStableName. Of course I haven't tested this, it's just a shot in the dark. -- ryan 2009/1/8 minh thu <not...@gmail.com>: > Interestingly, I failed to detect sharing with StableName. > But using the graph node as a key turned to work... > If you're interested in the experiment, see attached code. > > Cheers, > Thu > > 2009/1/8 minh thu <not...@gmail.com>: >> 2009/1/8 Ertugrul Soeylemez <e...@ertes.de>: >>> "minh thu" <not...@gmail.com> wrote: >>> >>>> Nothing, simply the notation. Now, with the remark of Luke, I'm >>>> wondering how bad it is to use makeStableName/hashStableName to "copy" >>>> the data structure in a similar one with explicit reference (that is, >>>> using pointer or keys in a map or whatever). >>> >>> Probably you're misusing the notation. I don't see any reason, why >>> monadic notation should be less readable. Usually it's even more >>> readable. Luke's remark is very valid. Haskell is the wrong language >>> for imperative programming. You don't have _any_ benefit of Haskell, if >>> you use it like C. Try to change your mind. Monads aren't evil. They >>> are there to make your life easier. Way easier than imperative methods. >> >> Well, maybe it's is just my opinion, but I found the non-monadic code >> in the previous mail >> easier to write than the monadic one... I don't know against what >> you're making the compareason to say it's more readable. >> >> Although I agree using Haskell requires some change of thinking, >> statement like yours >> are a bit too much for me. I find Haskell a nice language even for >> imperative programming... >> >> Cheers, >> Thu >> >>> Greets, >>> Ertugrul. >>> >>> >>>> Thank you, >>>> Thu >>>> >>>> 2009/1/8 Lennart Augustsson <lenn...@augustsson.net>: >>>> > Look at >>>> > http://www.haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-StableName.html. >>>> > >>>> > But what's wrong with constructing the graph in a monad? >>>> > >>>> > On Thu, Jan 8, 2009 at 9:53 AM, minh thu <not...@gmail.com> wrote: >>>> >> Well, the processing of the data structure has to be done in the IO >>>> >> monad. >>>> >> What is the library you talk about ? Could it give the "stable names" >>>> >> (in IO) for >>>> >> each node of the mentioned graph (I mean, after the graph has been >>>> >> constructed >>>> >> purely) ? >>>> >> >>>> >> Thanks, >>>> >> Thu >>>> >> >>>> >> 2009/1/8 Lennart Augustsson <lenn...@augustsson.net>: >>>> >>> Of course you don't need a monad, but you need to do the same >>>> >>> operations as you would with a state monad to number the nodes. This >>>> >>> is the only way in (pure) Haskell. There is no object identity in >>>> >>> Haskell, so if you want the nodes to have identity you need to provide >>>> >>> it. >>>> >>> >>>> >>> GHC does have a library for stable names which (in the IO monad) >>>> >>> allows you to get something akin to the address of a value in memory. >>>> >>> But that's not the functional way of doing this. >>>> >>> >>>> >>> -- Lennart >>>> >>> >>>> >>> On Thu, Jan 8, 2009 at 9:28 AM, minh thu <not...@gmail.com> wrote: >>>> >>>> Hi, >>>> >>>> >>>> >>>> I'd like to process some kind of graph data structure, >>>> >>>> say something like >>>> >>>> >>>> >>>> data DS = A [DS] | B DS DS | C. >>>> >>>> >>>> >>>> but I want to be able to discover any sharing. >>>> >>>> Thus, in >>>> >>>> >>>> >>>> b = B a a where a = A [C], >>>> >>>> >>>> >>>> if I want to malloc a similar data structure, >>>> >>>> I have to handle to the node representing B >>>> >>>> two times the same pointer (the one returned >>>> >>>> after allocating A [C]). >>>> >>>> >>>> >>>> To discover sharing, I thought it would be >>>> >>>> necessary to give unique name to node and >>>> >>>> then compare them while traversing the graph. >>>> >>>> I could give the name by hand but it would be >>>> >>>> cumbersome. But at least it would not require >>>> >>>> any monad for the bookkeeping of ungiven >>>> >>>> names. Is it possible to give those names >>>> >>>> automatically but outside any monad ? >>>> >>>> >>>> >>>> Thanks, >>>> >>>> Thu >>>> >>>> _______________________________________________ >>>> >>>> Haskell-Cafe mailing list >>>> >>>> Haskell-Cafe@haskell.org >>>> >>>> http://www.haskell.org/mailman/listinfo/haskell-cafe >>>> >>>> >>>> >>> >>>> >> >>>> > >>> >>> >>> >>> -- >>> nightmare = unsafePerformIO (getWrongWife >>= sex) >>> http://blog.ertes.de/ >>> >>> >>> _______________________________________________ >>> Haskell-Cafe mailing list >>> Haskell-Cafe@haskell.org >>> http://www.haskell.org/mailman/listinfo/haskell-cafe >>> >> > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe