Dear Chris,

For a parameterised functor creation you may consider writing a function which 
takes arguments, defines and returns a functor which uses these arguments 
(functors are first-class values).

Best
Torsten

--
Torsten Anders
Interdisciplinary Centre for Computer Music Research
University of Plymouth
http://strasheela.sourceforge.net
http://www.torsten-anders.de
________________________________________
From: [EMAIL PROTECTED] [EMAIL PROTECTED] On Behalf Of Chris Rathman [EMAIL 
PROTECTED]
Sent: 28 August 2008 23:29
To: Mozart users
Subject: Parameterized Functors

I've started on translating examples from the book Purely Functional
Data Structures by Chris Okasaki into Oz.  Only through chapter 2 so
far.  The code will be posted at:

http://www.codepoetics.com/wiki/index.php?title=Topics:PFDS_in_other_languages:Oz

In translating the ML code, I ran across a question about whether Oz
functors can take parameters.  In chapter 2.2, the example is an
UnbalancedSet that uses an Ordered functor for comparison operators.  I
can emulate the parameters by instantiating the functor and then
immediately turning around and calling a function to initialize it with
the functor parameter.  But I was wondering if I could send the
parameter as part of the Module.apply?  This is what I am currently using:

[OrderedValue] = {Module.apply [ORDEREDVALUE]}

[UnbalancedSet] = {Module.apply [UNBALANCEDSET]}
{UnbalancedSet.initialize OrderedValue}

It would be nice if I could combine the effects of these last two
statements.  (I may have asked this question before, but I don't recall
the resolution).

Here's the complete code from the translation:

% 2.2 UnbalancedSet
UNBALANCEDSET =
   functor
   export
      initialize : Initialize
      empty : Empty
      member : Member
      insert : Insert
   define
      Ordered
      proc {Initialize OrderedSet}
         Ordered = OrderedSet
      end
      Empty = nil
      fun {Member X S}
         case S
         of tree(A Y B) then
         if {Ordered.lt X Y} then
               {Member X A}
            elseif {Ordered.lt Y X} then
               {Member X B}
            else
               true
            end
         else false
         end
      end
      fun {Insert X S}
         case S
         of nil then tree(nil X nil)
         [] tree(A Y B) then
            if {Ordered.lt X Y} then
               tree({Insert X A} Y B)
            elseif {Ordered.lt Y X} then
               tree(A Y {Insert X B})
            else
               S
            end
         end
      end
   end

ORDEREDVALUE =
   functor
   export
      eq : EQ
      lt : LT
      leq : LEQ
   define
      fun {EQ X Y} X == Y end
      fun {LT X Y} X < Y end
      fun {LEQ X Y} X =< Y end
   end
[OrderedValue] = {Module.apply [ORDEREDVALUE]}

[UnbalancedSet] = {Module.apply [UNBALANCEDSET]}
{UnbalancedSet.initialize OrderedValue}

MyStackA = {UnbalancedSet.insert 1 UnbalancedSet.empty}
MyStackB = {UnbalancedSet.insert 2 MyStackA}
MyStackC = {UnbalancedSet.insert 4 MyStackB}
MyStackD = {UnbalancedSet.insert 3 MyStackC}
{Browse MyStackD}


Thanks,
Chris Rathman
_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users
_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users

Reply via email to