Ok, thanks.

On Fri, Aug 19, 2011 at 6:08 PM, Gabriel Dos Reis <g...@cs.tamu.edu> wrote:
> | >
> | > )abbrev category MYAGG MyAggegate
> | > MyAggegate(): Category == Type with
> | >    elementType: Ring              -- to be defined by each domain
> | >    toList: % -> List elementType  -- idem
> | >    sumAll: % -> elementType       -- this one has a default implementation
> | >  add
> | >    sumAll x == reduce(_+,toList x,0$elementType)
> | >
> | >
> | > This is just one simple example of (indirect) dependency.
> | > Type dependency requires an advanced decision procedure of type equality
> | > that goes beyond syntactic equally (which is the theoretical
> | > underpinning of most of current Spad, ML, and Haskell98 type system.)
> | >
> |
> Bill Page <bill.p...@newsynthesis.org> writes:
> | If the associated type is "defined on case by case basis by each
> | domain" we can make the dependency more explicit. Presumably we still
> | want types to be static. Is there any situation where the following
> | would not be adequate?
>
> The issue is not whether an associated type can be *encoded*.
>
> what you have done is to turn an implicit parameter (existentially
> quantified) into an explicit parameter (universally quantified), and
> ask each user to pass that around all the time, blurring the distinction
> between what is essential parameter from what is derivable (associated
> types).  It becomes unbearable when the number of associated type
> grows or there are redundancies.

Yes you are right. I see the point.

> There are some examples of that in the existing AXIOM algebras --
> and the problem is well know (at least from discussions with
> Stephen Watt.)
>

Yes, I recall such discussions.

> This is a well known technique that has been around for a while.  In fact,
> it was the status quo in Haskell, until the survey [1] that prompted the
> Haskell people to consider associated types, that later evolved into
> type families.   So, you are taking the opposite route of `improvements'
> that we have seen so far :-)  See discussions in the literature below.
>
> [1] http://dl.acm.org/citation.cfm?doid=949305.949317
> [2] http://dl.acm.org/citation.cfm?doid=1086365.1086397
> [3] http://dl.acm.org/citation.cfm?doid=1190315.1190324
> [4] 
> http://research.microsoft.com/en-us/um/people/simonpj/papers/assoc-types/fun-with-type-funs/typefun.pdf
>

Thanks for the references.

> [...]
>
> | Note: I had some problems using reduce in this context.
>
> what was it?
>

Sorry, thinko. I just forgot the package call. The following compiles:

)abbrev category MYAGG MyAggegate
MyAggegate(ElementType: Ring): Category == Type with
   elementType: Ring        -- to be defined by each domain
   toList: % -> List ElementType  -- idem
   sumAll: % -> ElementType       -- this one has a default implementation
 add
   elementType == ElementType
   sumAll x == reduce(_+,toList x,0)$ListFunctions2(ElementType,ElementType)

--

Here is another example similar to yours except the dependency is only
on a value instead of a type. This compiles: (in OpenAxiom):

--
)abbrev category MYITUP MyIntegerTuple
MyIntegerTuple(): Category == Type with
   elementSize: NonNegativeInteger  -- to be defined by each domain
   toProd: % -> DirectProduct(elementSize,Integer)
   sumAll: % -> Integer  -- this one has a default implementation
 add
   sumAll x == reduce(_+,entries toProd x,0)$ListFunctions2(Integer,Integer)
--

(1) -> )co dep4a-gaby.spad
   Compiling OpenAxiom source code from file /home/page/dep4a-gaby.spad
      using Spad compiler.
   MYITUP abbreviates category MyIntegerTuple

...

(1) -> )sh MYITUP
 MyIntegerTuple  is a category constructor
 Abbreviation for MyIntegerTuple is MYITUP
 This constructor is exposed in this frame.
 Issue )edit /home/page/dep4a-gaby.spad to see algebra source code for MYITUP

------------------------------- Operations --------------------------------
 elementSize : NonNegativeInteger      sumAll : % -> Integer
 toProd : % -> DirectProduct(elementSize,Integer)

However I was unable to find a way to compile a domain using this category. E.g.

--
)abbrev domain MYITUPD MyIntegerTupleDomain
MyIntegerTupleDomain():MyIntegerTuple with
    sample: () -> %
    coerce: % -> OutputForm
  == add
    Rep == DirectProduct(3,Integer)
    elementSize == 3
    toProd(x) == rep x
    sample() == per directProduct( [1,2,3] )
    coerce(x) == (entries rep x)::OutputForm
--

(1) -> )co dep4b-gaby.spad
   Compiling OpenAxiom source code from file /home/page/dep4b-gaby.spad
      using Spad compiler.
   MYITUPD abbreviates domain MyIntegerTupleDomain
------------------------------------------------------------------------
   initializing NRLIB MYITUPD for MyIntegerTupleDomain
   compiling into NRLIB MYITUPD
   Adding $ modemaps
   Adding Integer modemaps
   Adding NonNegativeInteger modemaps
   Adding PositiveInteger modemaps
   Adding Rep modemaps
   compiling exported elementSize : () -> NonNegativeInteger
      MYITUPD;elementSize;Nni;1 is replaced by 3

;;;     ***       |MYITUPD;elementSize;Nni;1| REDEFINED
Time: 0.02 SEC.

   Adding DirectProduct(elementSize,Integer) modemaps
   compiling exported toProd : % -> DirectProduct(elementSize,Integer)
****** comp fails at level 1 with expression: ******
error in function toProd

((|rep| |x|))
****** level 1  ******
$x:= (rep x)
$m:= (DirectProduct elementSize (Integer))
$f:=
((((|x| # #) (|#| # #) (* # # #) (** # # #) ...)))

   >> Apparent user error:
   Cannot coerce x of mode DirectProduct(3,Integer) to mode
DirectProduct(elementSize,Integer)


Regards,
Bill Page.

------------------------------------------------------------------------------
Get a FREE DOWNLOAD! and learn more about uberSVN rich system, 
user administration capabilities and model configuration. Take 
the hassle out of deploying and managing Subversion and the 
tools developers use with it. http://p.sf.net/sfu/wandisco-d2d-2
_______________________________________________
open-axiom-devel mailing list
open-axiom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open-axiom-devel

Reply via email to