From: Lucas Dixon <ldixon@inf.ed.ac.uk>
To: Andreas Rossberg <rossberg@mpi-sws.org>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] What is an applicative functor?
Date: Thu, 14 Apr 2011 23:08:46 -0400 [thread overview]
Message-ID: <4DA7B6BE.8090605@inf.ed.ac.uk> (raw)
In-Reply-To: <7123693C-B554-4944-9234-EA5E465E42B1@mpi-sws.org>
On 13/04/2011 03:23, Andreas Rossberg wrote:
> On Apr 13, 2011, at 04:36, Lucas Dixon wrote:
>>> I agree with Jacques. My primary argument for applicative functors is
>>> diamond import in libraries. Assume you have a set functor in a
>>> library A
>>> (e.g. the stdlib). Then there are two seperate libraries B and C,
>>> perhaps
>>> from different sources. Both need to use sets. And you want to use B
>>> and C
>>> and pass sets from one to the other.
>>>
>>> Without applicative functors, there are 3 possibilities:
>>>
>>> 1. Both B and C instantiate the Set functor separately and export the
>>> result
>>> -- then you have to convert between the incompatible set types all
>>> the time.
>>>
>>> 2. Both B and C functorize all their modules over a Set instance -- I
>>> think
>>> it's obvious that this doesn't scale.
>>
>> What do you feel is the problem is with scaling this up? (maybe I'm
>> being dumb, but I don't see what the issue is...)
>
> The problem is that you need to turn every module using a functor into a
> functor itself, and eventually end up piling up the entire transitive
> closure of your dependency graph in your functor parameters.
yes, the concept of module for SML is really a functor and dependencies
are explicit.
> My experience with the early MLKit, which used this so-called "closed
> functor style", was that it is horrible. You need lots of functor
> parameters, lots of structure nesting and reexporting (the sizes of
> signatures can grow exponentially!), and plenty of subtle sharing
> constraints.
My feeling was that a little improvement on the syntax of signatures and
sharing would deal with these issues fairly easily.
In terms of growing exponentially: that sounds like a serious problem; I
would expect it to grow linearly on the number of dependencies. Or did
you mean to use exponentially informally; as in gets too bug too quick?
> And when some new code you're writing does not type check,
> you sometimes spend considerable time figuring out whether that was a
> "real" error or you just forgot some type sharing somewhere.
I ended up pushing improvements to the type-error printing which helped
a lot in PolyML. That combined with a finding a style that works out not
too hideously: I create a sub-structure, typically called "Sharing" to
hold just types that are relevant to a particular module. I can then use
sharing on this substructure to share all types and save the others
painful problem to remember to share every type.
For example, see basic_graph.ML in Quantomatic code (a graph rewriting
tool in SML):
http://isaplanner.svn.sourceforge.net/viewvc/isaplanner/trunk/quantomatic/core/graph/basic_graph.ML?revision=3017&view=markup
So my basic feeling is still that this is an issue of finding a little
syntax sugar and then the functorial style could work well... (with the
sub-structure style I find it bearable, and can even enjoy using functors).
I guess the prerogative is to write that sugar and then try re-tasting
the functorial soup.
best,
lucas
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
next prev parent reply other threads:[~2011-04-15 3:09 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-07 21:12 Dawid Toton
2011-04-07 21:49 ` Gerd Stolpmann
2011-04-08 0:44 ` [Caml-list] " Dawid Toton
2011-04-08 1:34 ` Gerd Stolpmann
2011-04-08 6:50 ` [Caml-list] " Andreas Rossberg
2011-04-08 8:04 ` Alain Frisch
2011-04-08 8:20 ` Jacques Garrigue
2011-04-08 8:38 ` Jacques Garrigue
2011-04-08 8:44 ` Alain Frisch
2011-04-08 10:09 ` Jacques Garrigue
2011-04-08 11:25 ` Julien Signoles
2011-04-08 11:58 ` Alain Frisch
2011-04-11 7:10 ` Julien Signoles
2011-04-11 7:21 ` Julien Signoles
2011-04-08 13:43 ` rossberg
2011-04-08 16:26 ` Julien Signoles
2011-04-13 2:36 ` Lucas Dixon
2011-04-13 7:23 ` Andreas Rossberg
2011-04-15 3:08 ` Lucas Dixon [this message]
2011-04-19 14:04 ` Andreas Rossberg
2011-04-08 16:43 ` Till Varoquaux
2011-04-08 17:35 ` Alain Frisch
2011-04-08 18:44 ` Andreas Rossberg
2011-04-08 21:23 ` Lauri Alanko
2011-04-08 21:34 ` Guillaume Yziquel
2011-04-09 11:41 ` Andreas Rossberg
2011-04-08 5:35 ` Stefan Holdermans
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DA7B6BE.8090605@inf.ed.ac.uk \
--to=ldixon@inf.ed.ac.uk \
--cc=caml-list@inria.fr \
--cc=rossberg@mpi-sws.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox