[mercury-users] Dispatch tables? Curried functions?

Ralph Becket rafe at cs.mu.OZ.AU
Wed Jun 5 15:35:48 AEST 2002

Douglas Michael Auclair, Wednesday,  5 June 2002:
> Hello, all,
> I wish to create a map that has string keys and function values to use as a 
> dispatch table.  The problem I have is that predicate lookup/3 returns the 
> function in the ground state, not the state of the function (e.g.: 
> func((ground -> ground), (ground -> ground)) = (free -> ground)) -- the 
> function lookup also returns the function in the undesired ground state.

Function insts of the form

	func(in, ..., in) = out is det

are sub-insts of ground.  You can have collections of them without
having to worry about modes.

The latest ROTD versions of the compiler support polymorphic modes
(necessary for more complex higher-order collections, such as preds and
non-det funcs), but we haven't got round to updating the modes in the
library yet.

> I worked around this by creating a top-level predicate with the appropriate 
> type qualifications (see next paragraph).  Is that the only way to go?  Is 
> it possible to create dispatch tables using maps?  How would this be done?
> Another issue:  the documentation is clear on how to create predicates that 
> return predicates (by declaring the out parameter as type (e.g.) free -> 
> pred(in, out) is det).  But I'm not getting the syntax for predicates or 
> functions that return functions:  free -> func(int) = int doesn't work, nor 
> does free -> (func(int) = int).  What is the proper mode/instantiation for 
> a function that returns a function?

You're getting insts and types mixed up.
(free >> (func(in) = out is det)) is probably what you mean.

Note that it's easier and shorter to use the standard parametric modes,
such as out(func(in) = out is det).

> My work-around for this one is to package the function to be curried into a 
> locally declared predicate, call a predicate that returns the curried 
> predicate, and then unpackage that new predicate into a local function.  
> Quite a bother!  Is there a one-step way of currying functions?

Well, provided you're only interested in standard mode functions, you
don't actually need to do anything (other, perhaps, than to upgrade to a
recent ROTD.)

- Ralph
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list