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

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. 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

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.

Regards,
Bill Page.

-------------------------------------------------------------------------
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
open-axiom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open-axiom-devel

Reply via email to