[Haskell-cafe] Re: What do _you_ want to see in FGL?
Heinrich Apfelmus
apfelmus at quantentunnel.de
Fri May 14 03:35:19 EDT 2010
Ivan Miljenovic wrote:
> Heinrich Apfelmus wrote:
>>
>> Yes, the integers are just indexes. Of course, the example with the even
>> integers is a bit silly; but if the integers are actually indexes, then
>> it's conceptually cleaner to make them abstract, i.e.
>>
>> data Node -- constructors are not exported
>>
>> and provide combinators to operate on these abstract indexes, including
>> a corresponding Data.Graph.Inductive.NodeMap module.
>>
>> I'd like to see such an abstract Node type, because then the library
>> will provide all operations I need. It took me some time to figure out
>> how to best use Int as indexes in my example code; an abstract Node
>> type and a good NodeMap module would have made my life much easier.
>
> I'm not sure I understand what you're saying here: first you said you
> wanted to be able to specify a vertex type, now you're saying that you
> don't want to know what the vertex type even is (except that it's some
> abstract Node type)? Whilst this would make graph usage safer/more
> robust, this seems to contradict your earlier arguments...
I'd be happy with either one. :) In both cases, I want to specify a
custom vertex type.
I can either do that directly if the library permits, though I think the
solution with associated types is too cumbersome to be useful for my
make example.
Or I get an abstract Node type and the library provides just the right
functions that make it easy to manage a custom vertex type myself. I had
hoped that the Data.Graph.Inductive.NodeMap module provides this,
which it doesn't.
In other words, the abstractness of Node forces the library to provide
a well-designed set of functions to work with them, and that's what I'm
after. In my make example, I spent the most time thinking about how to
manage the Int nodes, finally settling with Data.Map.findIndex , and
I prefer the library to think about that for me.
>> Darn, I meant
>>
>> data Graph node a b =
>> Graph { internal :: Graph Int a b, nodes :: Map Int a }
>>
>> The idea is to use Ints internally and only store a loose association
>> to the custom vertex type. In particular, no Map a Int is required,
>> only from Int to a . Now, I realize that the other way round is
>> required as well for querying the context of a node in a graph.
>
> What's the point of that useless node type parameter then? And how
> does the nodes map differ from just getting the graph label?
You're right, I now realize that this design doesn't work. But you asked
for wishes, so I wished for something. ;)
Regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
More information about the Haskell-Cafe
mailing list