<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffee" text="#000000">
<tt>Vesa Karvonen wrote:<br>
</tt>
<blockquote
 cite="mid:9e43b9a0703041114n4a56a84l6022920ef49ad54a@mail.gmail.com"
 type="cite"><tt>Like I said, I'm not sure that I understand the idea. 
Let's say that a
  <br>
type (module defining the type) would implement both HAS_PRODUCTS and
  <br>
HAS_UNIT.  Would this mean that it has constructors with the types
  <br>
  <br>
 t * t -&gt; t
  <br>
  <br>
and
  <br>
  <br>
 unit -&gt; t
  <br>
  <br>
An example of such a datatype would be, for example,
  <br>
  <br>
 datatype t = PRODUCT of t * t | UNIT .
  <br>
  <br>
IOW, the idea is that one would specify the structure of a datatype
using
  <br>
the signatures.  If this is roughly the idea, then I think that one or
  <br>
more of the ways of encoding type-indexed values might be more
practical.
  <br>
See, for example,
  <br>
  </tt>
</blockquote>
<tt>    I am thinking about it more categorically/algebraically, rather
than for specifying the structure of the datatype.  Here are perhaps
what I would consider the minimal signatures for »HAS_PRODUCTS« and
»HAS_UNIT«<br>
<br>
    signature HAS_PRODUCTS = sig<br>
       type t<br>
       val formProduct : t * t -&gt; t<br>
       val isProduct : t -&gt; bool<br>
       val fst : t -&gt; t Option.t<br>
       val snd : t -&gt; t Option.t <br>
    end<br>
<br>
    signature HAS_UNIT = sig<br>
       type t<br>
       val formUnit : unit -&gt; t<br>
       val isUnit : t -&gt; bool<br>
    end<br>
<br>
Then one could provide implementations of »HAS_PRODUCTS« and »HAS_UNIT«
for any number of things, such as lists, sets, prime integers, etc.
that implements some notion of products and units on that data type.
For sets one could use the empty set as the unit, and the Cartesian
product on sets as the product operation.  For prime integers one could
use multiplication as the product and 1 as the unit.  However, it would
probably be useful to also supply a type-indexed version<br>
<br>
    signature HAS_PRODUCTS' = sig<br>
       type 'a t<br>
       val formProduct : 'a t * 'b t -&gt; ('a, 'b) Pair.t t<br>
       val isProduct : 'a t -&gt; bool<br>
       val fst : ('a, 'b) Pair.t t -&gt; 'a t<br>
       val snd : ('a, 'b) Pair.t t -&gt; 'b t<br>
    end<br>
<br>
    signature HAS_UNIT' = sig<br>
       type 'a t<br>
       val formUnit : unit -&gt; unit t<br>
       val isUnit : 'a t -&gt; bool<br>
    end<br>
<br>
I suppose it is arguable that these are too abstract to be useful as
part of the extended basis. <br>
<br>
</tt>
<pre class="moz-signature" cols="72"><tt>-- 
[Geoff Washburn|<a class="moz-txt-link-abbreviated" href="mailto:geoffw@cis.upenn.edu">geoffw@cis.upenn.edu</a>|<a class="moz-txt-link-freetext" href="http://www.cis.upenn.edu/~geoffw/">http://www.cis.upenn.edu/~geoffw/</a>]</tt>
</pre>
</body>
</html>