[Haskell-cafe] Re: How to give unique name/id to nodes outside any monad ?

Ryan Ingram ryani.spam at gmail.com
Thu Jan 8 21:43:05 EST 2009


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 <noteed at 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 <noteed at gmail.com>:
>> 2009/1/8 Ertugrul Soeylemez <es at ertes.de>:
>>> "minh thu" <noteed at 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 <lennart at 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 <noteed at 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 <lennart at 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 <noteed at 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 at haskell.org
>>>> >>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>> >>>>
>>>> >>>
>>>> >>
>>>> >
>>>
>>>
>>>
>>> --
>>> nightmare = unsafePerformIO (getWrongWife >>= sex)
>>> http://blog.ertes.de/
>>>
>>>
>>> _______________________________________________
>>> Haskell-Cafe mailing list
>>> Haskell-Cafe at haskell.org
>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>
>>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>


More information about the Haskell-Cafe mailing list