proposal of true fuctional module loading
S.D.Mechveliani
mechvel@math.botik.ru
Sat, 28 Apr 2001 14:52:06 +0400
This may sound strange, but
could Haskell think of supporting a true functional module loading?
As the interactive systems exist, with interactive loading, and so
on, maybe, it can be provided a library of Haskell functions:
compile :: Env -> SrcModule -> (Interface, CodeModule)
parse :: Env -> CodeModule -> String -> Expression
load :: Env -> CodeModule -> Env
evaluate :: Env -> CodeModule -> Expression -> Expression
- something like this.
Let
all the code be interpreted (so far),
env :: Env keep all the interface modules and the code modules,
(parse env md str)
returns the value of the type which the compiler would assign
to the data read from str, under the given program scope
(env,md).
The idea is to enable a regular user's Haskell program to create a
source program md :: SrcModule (not a file), compile it
(lightly, as, for example, in Hugs-98) to interpreted code and load
- under (and to) the accumulated total program env :: Env.
env, md are the explicit variables in the user program, and no side
effects happen.
`parse', `evaluate' may use the built-in compiler and interpreter.
This is something like Hugs interactive system given to the user
in the form of the library functions, with the explicit variables
and arguments to hold the values of environment and program code.
This is not extending the language, only the library.
The aim is to enable the user program to create at the run-time new
algebraic domains in the form of types and instances contained in
new source and code modules.
The type resolution remains static, but becomes (I am sorry)
dynamic at the new level.
This is another alternative to the
sample argument approach - disliked by many,
dependent types language extension - concerning a language and
to have problems of it own.
Example:
the user program can `load' the domains
(modules with types and instances) P_1 .. P_n
of integer polynomials in variables
[x1], [x1,x2], [x1,x2,x3], ..., [x1..xn]
respectively and compute the needed things, say, 5 minutes in each
domain, while the compilation and loading of P_i will need a
couple of seconds. Also the new loaded and interpreted code may
refer to the compiled library, like it is done in ghc-5.00.
Here n is a variable; it is not known statically how many P_i
will suffice to solve a task. Also the domains P_i have different
properties and even should have different instances, and it is not
good to pile them in one type.
This concerns the same old discussion thread about possibility to
create dynamically, say, the domains of Integer modulo different
m = 2,3,...
Can the Haskell library take a step in this direction?
In some term rewriting logical systems, like Maude,
the `programs' have rich type system (types are called `sorts'), but
still are the first class data (in meta-coding), can be created with
the usual data constructors and then, meta-applied.
But there, I suppose, there is no `loading'. Because Maude has a
particular `import' notion, which is not likely to be supported by
Haskellers.
-----------------
Serge Mechveliani
mechvel@botik.ru