<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE message PUBLIC
  "-//MLarc//DTD MLarc output files//EN"
  "../../mlarc.dtd"[
  <!ATTLIST message
    listname CDATA #REQUIRED
    title CDATA #REQUIRED
  >
]>

  <?xml-stylesheet href="../../mlarc.xsl" type="text/xsl"?>


<message 
  url="2002/07/47f6ab2d7a669a9060d5725cfc33d0cb"
  from="Markus Mottl &lt;markus@o...&gt;"
  author="Markus Mottl"
  date="2002-07-15T08:44:45"
  subject="Re: [Caml-list] About modules again"
  prev="2002/07/dcd284c79534a353c36303b9cc302afe"
  next="2002/07/0b3b47e0634faa28e483cc3e08503429"
  prev-in-thread="2002/07/1b29cfdfd19552b03e846f44303aa30e"
  next-in-thread="2002/07/9318d960b2578fae39e524c42bcf2882"
  prev-thread="2002/07/9d191dbdc8b05bc3b233f36a11ac6504"
  next-thread="2002/07/9c344668384b0077ed1732712963cb19"
  root="../../"
  period="month"
  listname="caml-list"
  title="Archives of the Caml mailing list">

<thread subject="[Caml-list] About modules again">
<msg 
  url="2002/07/1b29cfdfd19552b03e846f44303aa30e"
  from="Nicolas FRANCOIS &lt;nicolas.francois@f...&gt;"
  author="Nicolas FRANCOIS"
  date="2002-07-15T00:35:01"
  subject="[Caml-list] About modules again">
<msg 
  url="2002/07/47f6ab2d7a669a9060d5725cfc33d0cb"
  from="Markus Mottl &lt;markus@o...&gt;"
  author="Markus Mottl"
  date="2002-07-15T08:44:45"
  subject="Re: [Caml-list] About modules again">
<msg 
  url="2002/07/9318d960b2578fae39e524c42bcf2882"
  from="Nicolas FRANCOIS &lt;nicolas.francois@f...&gt;"
  author="Nicolas FRANCOIS"
  date="2002-07-16T09:51:19"
  subject="Re: [Caml-list] About modules again">
</msg>
</msg>
</msg>
</thread>

<contents>
On Mon, 15 Jul 2002, Nicolas FRANCOIS wrote:
&gt; (it's an Euclidian Ring, but that's not the point). So you see my problem
&gt; : I have to define a concrete method in an abstract module, just not to
&gt; have to fill the definition for every new Ring I define.
&gt; 
&gt; Is there a way to do this ? Or is this specific to objects ?

This is the point where higher-order modules (functors) enter the game.
If you have some common functionality that is shared across all rings,
you can factor it out in a functor body. E.g.:

  module MakeRing (Spec : RING_SPEC) : RING = struct
    include Spec

    (* All common stuff follows here *)
  end

Module "Spec" should adhere to a signature "RING_SPEC", the latter
specifying what is different or at least parameterizable for each
ring. Applying the functor to such a specification yields a module that
implements the signature RING, e.g.:

  module Ring_Z = MakeRing (Ring_Z_Spec)

The specification of rings over Z (Ring_Z_Spec) may itself be the result
of a functor application. This way you can highly modularize the creation
of algebraic structures.

Btw., you'd surely get into troubles using OO here. It is not very
suitable for such purposes, because it lacks expressiveness if you want
to specify interaction of several types (sorts) at an abstract level.

Regards,
Markus Mottl

-- 
Markus Mottl                                             markus@oefai.at
Austrian Research Institute
for Artificial Intelligence                  http://www.oefai.at/~markus
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners

</contents>

</message>

