"Bill Page" <[EMAIL PROTECTED]> writes:
| On Thu, Apr 3, 2008 at 11:13 AM, Gabriel Dos Reis wrote:
| >
| > Bill Page writes:
| >
| > | On Thu, Apr 3, 2008 at 10:58 AM, Gabriel Dos Reis wrote:
| > | >
| > | > Bill Page writes:
| > | >
| > | > | I don't think 'reduce(+,[])' requires too much magic - at least in
| > | > | the interpreter. Try:
| > | > |
| > | > | (1) -> myreduce(f,x)==(#x>1 => f(first x,myreduce(f,rest x)); #x=1
=> first x; f=_+ => 0; f=_* => 1;error "use: reduce(op,list,id)")
| Type: Void
| > | > ...
| > | > | (5) -> myreduce(+,[])
| > | > | Compiling function myreduce with type (Variable +,List None) ->
| > | > | NonNegativeInteger
| > | > |
| > | > | (5) 0
| > | > | Type:
NonNegativeInteger
| > | >
| > | > I'm very surprised you find that result OK.
| > | >
| > |
| > | I expect that
| > |
| > | reduce(+,A) + reduce(+,B) == reduce(+,concat(A,B))
| > |
| > | so what else could it be?
| >
| > So, you expect that reducing addition operator over a List None should
| > yield a NonNegativeInteger? I'm awfully surprised.
| >
|
| Well I *am* quite surprised by the signature that the interpreter
| chooses for this function:
|
| (Variable +,List None) -> NonNegativeInteger
The interpreter type-checks/infers argument types (separately) and then
do something (not always sensible). In this case, it could not find
ways to assign a type to '+', so it decided that it must be a
variable named '+'. Second, it looks at '[]' and sees that it is list
of something. It does not know what that something is (the notation
is ambiguous). So it decided that it is a list of nothing -- which is
utterly wrong. It should have been
forall(T: Type) . List T
but we don't have universal quantification yet. Now, from a variable
'+' and a list of nothing, it returns integer 0. I believe everybody
must reject that answer, even it beaned some vague resemblance to the
expected answer, because we don't just want the `right answer'. We
want the correct answer.
The notion of reduction is that:
(1) one can left- or right- reduce a magma operation non non-empty
sequences of items;
(2) or just reduce (left or right does not matter) an
associative operation on non-empty sequence of items;
(3) or just reduce (left or right does not matter) a monoid
operation on a possibly empty sequence of items.
In all causes, the type of the result is the type of the items in the
sequence. So, getting NonNegativeInteger 0 from List None reduction
must look wrong -- just like it is wrong for systems to return integer
0 and two matrices are subtracted.
The truth is that
reduce(+,[])
is doubly ambiguous: there are at least a dozen of stuff called '+'.
And [] is the empty list of type any type. I don't see how 0 could be
seen as the result.
| and as I said previously, I find it a little "magic" that the
| expression 'f(first x,myreduce(f,rest x))' apparently compiles as the
| naive user might expect.
a very special naive user then :-)
| Really should have written '_+$Integer'
| instead of just '+'
|
| (2) -> myreduce(_+$Integer,[])
| Compiling function red with type (((Integer,Integer) -> Integer),
| List None) -> Integer
|
| (2) 0
| Type: NonNegativeInteger
Even there, I would have expected a type error. The type of the
operation does not match the type of the contained element (None).
|
| But now perhaps equally "magic" is that 'f=_+ => 0' again naively just works
...
|
| In the library code what I really wanted was something like this
| modification to ListAggregate:
|
| reduce(f, x) ==
| if empty? x then
| if S has AbelianMonoid then
| f=_+$S => 0$S
| if S has Monoid then
| f=_*$S => 1$S
| error "reducing over an empty list needs the 3 argument form"
| reduce(f, rest x, first x)
|
| since presumably then we are checking the specific algebraic
| properties of the operation. But this does not compile in Spad.
Yeah.
-- Gaby
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
open-axiom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open-axiom-devel