[kepler-dev] question on typing processes and higher-order functions a la map

Bertram Ludaescher ludaesch at sdsc.edu
Tue May 25 13:08:53 PDT 2004


Hi:

Liying Sui and I recently came across the following typing problem:

Consider an actor, say "factors" which computes for a given int I, all
the prime factors of I. For example factors(20) = [2,2,5]

Thus, the signature of factors is:

	factors :: int --> [int] 

Now assume factors is to be applied on a stream <x1, x2, x3, ...> of
integers, denoted <int>

It seems tempting to view the *process* Factors that is so created as
applying the higher-order map function to factors, i.e., 
	Factors = map(factors)

There are some interesting typing issues. Let's say map has the
following type on streams:

	map :: (a-->b) --> <a> --> <b> 

That is, map takes a function of type (a-->b) and a stream of a's
(denoted <a>) and returns a stream of b's.
Therefore the type of the Factors process can be determined to be

	Factors :: <int> --> < [int] >	  

Example: Factors( <4, 6, 10, ... > ) = < [2,2], [2,3], [2,5], ... >

So far so good -- no information is lost.

It seems, however, that in practise sometimes  another process is
created: 
	Factors'( <4, 6, 10, ... > ) = < 2,2,2,3,2,5, ... >

Clearly this process Factors' does lose some information (the grouping
of result tuples into list of prime factors). While for this specific
example, Factors' is not desirable, such a "flattening" behavior seems
to be used in practise: 

Let say we change our original function factors to produce not a list
of ints, but a stream of them:
 
	factors' :: int --> <int> 

This correspond to a token consumption/production pattern of " 1:* "
(for each input token, we might get multiple output tokens).

Is it correct that in Ptolemy II using factors' with an SDF director
produces a process Factors' on streams that has the signature:

	Factors' :: <int> --> <int> 

In order to make this behavior type-correct it seems we may have to
say that <<int>> = <int>, because we get 

	map(factors') = Factors'

and the former has the type

	map(factors') ::  <int> --> < <int> >

Note that the type of map(factors') is obtained by using the general
type of map above: 

	map :: (a-->b) --> <a> --> <b> 

and the applying this to factors' :: int --> <int>
(hence a = int and b = <int>)

So if indeed Factors' is of the said type we must accept (whether we
like it or not ;-) that <<int>> = <int> (or in general, nesting
streams in this way yields a "flat" stream).

Comments?? 
Does Ptolemy II with an SDF director and an actor of type
	myactor :: a --> <b> 
produce a process
	MYACTOR :: <a> --> <b> 
which thus can be explained as a "special map" over streams with the
type identity <<b>> = <b> ??

Thanks in advance!

Bertram and Liying




More information about the Kepler-dev mailing list