On 08/16/2007 02:18 PM, Gabriel Dos Reis wrote:
> On Thu, 16 Aug 2007, Ralf Hemmecke wrote:
>
> | % as the argument of RepeatedSquaring stands for a domain of type Monad().
> | Such a domain obviously satisfies
> |
> | SetCategory with {*: (%,%)->%}
> |
> | since Monad() has these exports (and more in the Axiom library case).
>
> Please be more precise about "satisfies". What does it mean?
That was written above. So let me repeat:
Monad() (in Axiom) exports the symbols
(*1*)
Monad
SetCategory
*: (%,%)->%
rightPower: (%,PositiveInteger) -> %
leftPower: (%,PositiveInteger) -> %
**: (%,PositiveInteger) -> %
The requirements of the argument of RepeatedSquaring are
(*2*)
SetCategory
*:(%,%)->%
Now "
Monad
satisfies
SetCategory with *:(%,%)->%
means that the (*1*) is a superset of (*2*).
Quote from AUG Section 7.7 "Type satisfaction" (p.83).
We say that a type S satisfies the type T if any value of type S
can be used in any context which requires a value of type T.
For example Integer is a value of type Monad (I hope). Integer (or any
other domain of type Monad) can be used in a place where (*2*) is
required. Why do I need coercion here? It's just a check that the
exports of a certain domain are a superset of the required exports.
> I understand what it means it terms of "has".
That is SPAD compiler biased. ;-)
> [...]
>
> | Gaby, you have given in
> |
> | http://lists.nongnu.org/archive/html/axiom-developer/2007-08/msg00412.html
> |
> | how the "add" part in the Monad definition is translated to a private domain.
>
> In fact, there is no nothing private about it. The rewrite is available
> to user.
>
> | That looks perfectly fine to me.
> | Bill has already shown that a proper value for the argument of
> | RepeatedSquaring as in
> |
> | http://wiki.axiom-developer.org/SandBoxMonad
> |
> | works fine.
> |
> | Gaby, you write there:
> |
> | Now the compiler goes on typecheking the defnition x ** n.
> | It sees the use of expt() and find out that the only expt() in
> | scope if the one from RepeatedSquare(S). Then it tries
> | to instantiate that package -- just like a function call.
> | From there, it applies the usual rules: Can I coerce S of
> | type Monad to the expected argument type of RepeatedSquare()?
> | They answer comes out as "no". Hence the error.
> |
> | Why would the compiler want to "coerce" if all that is needed is to check
> | whether S of type Monad has at least the exports that are required by the
> | argument type of RepeatedSquaring.
>
> The compiler is doing that because it treats function calls -- either
> to produce a value of a type -- uniformly. It seems to me that you're
> arguing two non-uniform rules: one for value, and one for types. Is that
> correct?
Hmmm, I would say, I don't completely understand all that, but I tend to
say "yes".
You cannot achieve that uniformity. Take
define Cat: Category == with;
define Foo(T: Cat): Category == with {};
DomI: Foo(Integer) == add;
DomS: Foo(String) == add;
b1: Boolean == DomI has Foo(Integer);
b2: Boolean == DomI has Foo(String);
b3: Boolean == DomS has Foo(Integer);
b4: Boolean == DomI has Foo(String);
If you treat domain constructors in the same way as basic values
(functions) then
Foo(Integer) = Foo(String) = with {}
So b1, ..., b4 should all be true, right? But I remember faintly that
you argued about a functional language with respect to the types and
that you would like to be able to distinguish
Foo(Integer) from Foo(String)
No? Where would be the uniformity here?
Ralf