Newsgroups: comp.lang.functional,comp.answers,news.answers
Path: bloom-beacon.mit.edu!news.media.mit.edu!uhog.mit.edu!MathWorks.Com!yeshua.marcam.com!zip.eecs.umich.edu!newsxfer.itd.umich.edu!gumby!yale!cs.yale.edu!news
From: jones-mark@CS.YALE.EDU (Mark P. Jones)
Subject: comp.lang.functional Frequently Asked Questions (monthly posting)
Message-ID: <1994Apr14.173241.21267@cs.yale.edu>
Followup-To: comp.lang.functional
Summary: This posting contains a list of
         frequently asked questions (and
         their answers) about functional
         programming languages and their
         implementations.
Sender: news@cs.yale.edu (Usenet News)
Nntp-Posting-Host: chickadee.systemsz.cs.yale.edu
Organization: Yale University, Department of Computer Science, New Haven, CT
Date: Thu, 14 Apr 1994 17:32:41 GMT
Approved: news-answers-request@MIT.Edu
Lines: 926
Xref: bloom-beacon.mit.edu comp.lang.functional:2292 comp.answers:4906 news.answers:18052


Archive-name: func-lang-faq
Last-modified: April 14, 1994

---------------------------------------------------------------------------
             A Frequently Asked Questions list (FAQ) for
                      comp.lang.functional
---------------------------------------------------------------------------
A copy of this FAQ is available by anonymous ftp from nebula.cs.yale.edu in
the file pub/comp.lang.functional/FAQ.
---------------------------------------------------------------------------
New this month:
 - Information about NESL
 - A new section in response to the recent threads on `purity and the FAQ'.

---------------------------------------------------------------------------
TABLE OF CONTENTS:

1) GENERAL QUESTIONS
   1.1) What is a functional language?
   1.2) Where can I find out more about the history and motivation
        for functional programming?
   1.3) Are there any books about functional programming?
   1.4) Where is a good place to look for information about current
        research in functional languages?
   1.5) What other newsgroups might be of interest to readers of
        comp.lang.functional?
   1.6) Is comp.lang.functional archived anywhere?

2) FREQUENT TOPICS OF DISCUSSION:
   2.1) What is a monad?
   2.2) How can I write a parser in a functional language?
   2.3) What does it mean to say that a language is strict/non-strict?
   2.4) What about the performance of functional programs?
   2.5) What is a purely functional language?
   2.6) Other subjects:

3) LANGUAGE IMPLEMENTATIONS:
   ASpecT, Caml Light, Clean, Erlang, FP, Gofer, Haskell, Hope, Id, IFP,
   J, Miranda(TM), ML, NESL, OPAL, Scheme and Sisal.

4) OTHER RESOURCES:
   4.1) Bibliographies:
   4.2) Translators:
   4.3) Online services:

5) CREDITS AND DISCLAIMERS:

---------------------------------------------------------------------------
1) GENERAL QUESTIONS:

Comp.lang.functional is an unmoderated usenet newsgroup for the
discussion of functional programming languages, including their
design, application, theoretical foundation and implementation.

---------
1.1) What is a functional language?

Opinions differ, even within the functional programming community,
on the precise definition of ``functional programming languages''.
Here is a definition that, broadly speaking, represents the kind of
languages that are discussed in this newsgroup:

  Functional programming is a style of programming that emphasizes
  the evaluation of expressions, rather than execution of commands.
  The expressions in these language are formed by using functions to
  combine basic values.

  A functional language is a language that supports and encourages
  programming in a functional style.

  For example, consider the task of calculating the sum of the
  integers from 1 to 10.  In an imperative language, this might be
  expressed using a loop, repeatedly updating the values held in
  counter and accumulator variables:

       total = 0;
       for (i=1; i<=10; ++i)
           total += i;

  In a functional language, the same program would be expressed
  without any variable updates.  For example, in Haskell or Miranda,
  the required sum can be calculated by evaluating the expression:

       sum [1..10].

  Here, [1..10] is an expression that represents the list of integers
  from 1 to 10, while sum is a function that can be used to calculate
  the sum of an arbitrary list of values.

  The same idea could also be used in strict languages like ML or
  Scheme, but it is more common to find such programs written with
  an explicit loop, often expressed as a form of recursion.
  Nevertheless, there is still no need to update the values of the
  variables involved.

  SML:    let fun sum i tot = if i=0 then tot else sum (i-1) (tot+i)
          in sum 10 0
          end

  Scheme: (define sum
             (lambda (from total)
                 (if (= 0 from)
                     total
                     (sum (- from 1) (+ total from)))))
          (sum 10 0)

  Of course, it is often possible to write programs in an imperative
  language using a functional style, and vice versa.  It is then
  a matter of opinion whether a particular language can be described
  as functional or not.


---------
1.2) Where can I find out more about the history and motivation
for functional programming?

Here are a couple of references that should help:

  "Conception, Evolution, and Application of Functional Programming
  Languages", Paul Hudak, ACM Computing Surveys, Volume 21, Number 3,
  pp.359--411, 1989.

  "Why functional programming matters", John Hughes, The Computer
  Journal, Volume 32, Number 2, April 1989.


---------
1.3) Are there any books about functional programming?

Yes, there are quite a few.  For details about programming in a
functional language:

  o  "Introduction to functional programming", Richard Bird and
     Philip Wadler, Prentice Hall, 1988.  ISBN 0-13-484189-1.

  o  "ML for the working programmer", L.C. Paulson, Cambridge
     University Press, 1991.  ISBN 0-521-39022-2.

And for those with an interest in implementation:

  o  "The implementation of functional programming languages",
     Simon Peyton Jones, Prentice Hall, 1987.  ISBN 0-13-453333-X.

  o  "Compiling with continuations", Andrew Appel, Cambridge
     University Press, 1992.  ISBN 0-521-41695-7.

For brevity, I've restricted myself to two books in each of the
above categories, one concerned with non-strict languages, the
other with strict languages.  There are several other good books
in each category.

The following article may also be of interest to those looking for
books about functional programming:

  o  Simon Thompson, Comparative review of functional programming
     textbooks (Bailey, Bird and Wadler, Holyer, Paulson, Reade,
     Sokoloski, Wikstrom), Computing Reviews, May 1992 (CR number
     9205-0262).


---------
1.4) Where is a good place to look for information about current
     research in functional languages?

Here are some good places to start:

Journals:
  o  The Journal of Functional Programming, published by CUP.
  o  Lisp and Symbolic Computation, published by Kluwer.

Conference proceedings:
  o  Lisp and Functional programming (LFP).
  o  Functional Programming Languages and Computer Architecture (FPCA).
  o  Principles of Programming Languages (POPL).
  o  European Symposium on Programming (ESOP).

  (Most of these are published by the ACM press, or in the Springer
  Verlag Lecture Notes in Computer Science Series).


---------
1.5) What other newsgroups might be of interest to readers of
comp.lang.functional?

There are several newsgroups dealing with related languages and
ideas, including:

    comp.lang.ml	for discussion related to ML
    comp.lang.scheme	for discussion about Scheme
    comp.lang.lisp	for discussion about Lisp
    comp.lang.apl	for discussion about APL, J, etc.


---------
1.6) Is comp.lang.functional archived anywhere?

No, as far as I know, there is no public archive of comp.lang.functional
(but, of course, many readers keep copies of old articles for their
personal use).  The possibility of establishing a public archive
has been raised a number of times in the past but have not been
pursued due to an apparent lack of interest, and concerns that
archiving might discourage novices from posting articles.


---------------------------------------------------------------------------
2) FREQUENT TOPICS OF DISCUSSION:

2.1) What is a monad?
---------------------
The concept of a monad comes from category theory; I'll spare you
the full details since you can find these in standard text books
on the subject.  Much of the recent interest in monads in functional
programming is the result of recent papers that show how monads
can be used to describe all kinds of different programming language
features -- for example, I/O, manipulation of state, continuations
and exceptions -- in purely functional languages like Haskell.

  o  Philip Wadler, Comprehending Monads (from the ACM conference
     on LISP & Functional Programming, Nice, France, 1990).

  o  Philip Wadler, The Essence of Functional Programming (from ACM
     Principles of Programming Languages 1992).

  o  Simon Peyton Jones and Philip Wadler, Imperative Functional
     Programming (from ACM Principles of Programming Languages 1993).

These papers are essential reading for anyone interested in the
use of monads for functional programming.  Copies of these papers
are currently available by anonymous ftp from ftp.dcs.glasgow.ac.uk
in the subdirectory pub/glasgow-fp/papers.


2.2) How can I write a parser in a functional language?
-------------------------------------------------------
A parser is a program that converts a list of input tokens, usually
characters, into a value of the appropriate type.  A simple example
might be a function to find the integer value represented by a
string of digits.  A more complex example might be to translate
programs written in a particular concrete syntax into a suitable
abstract syntax as the first stage in the implementation of a
compiler or interpreter.  There are two common ways to write a
parser in a functional language:

  o  Using a parser generator tool.  Some functional language
     implementations support tools that generate a parser automatically
     from a specification of the grammar (in much the same way that
     a C programmer uses yacc).  Different tools are available,
     depending on the language and implementation used.

  o  Using combinator parsing.  Parsers are represented by functions
     and combined with a small set of combinators, leading to
     parsers that closely resemble the grammar of the language
     being read.  Parsers written in this way can use backtracking.
     The techniques of combinator parsing have been known for quite
     some time.  Two comparatively recent papers on the subject are:

       -  "How to Replace Failure with a List of Successes",
          Philip Wadler, FPCA '85, Springer Verlag LNCS 201, 1985.

       -  "Higher-order functions for parsing", Graham Hutton,
	  Journal of Functional Programming, 2, 3, July 1992.

     The latter paper is also available by anonymous ftp from
     ftp.cs.chalmers.se in the file pub/cs-reports/papers/parsing.dvi
     and includes some references to other related papers.


2.3) What does it mean to say that a language is strict/non-strict?
--------------------------------------------------------------------
Here's one (operational) way to explain the difference:

In a strict language, the arguments to a function are always
evaluated before it is invoked.  As a result, if the evaluation of
an expression exp does not terminate properly (for example, because
it generates a run-time error or enters an infinite loop), then
neither will an expression of the form  f(exp).  ML and Scheme are
both examples of this.

In a non-strict language, the arguments to a function are not
evaluated until their values are actually required.  For example,
evaluating an expression of the form f(exp) may still terminate
properly, even if evaluation of exp would not, if the value of
the parameter is not used in the body of f.  Miranda and Haskell
are examples of this approach.

It is possible to support a mixture of these two approaches; some
versions of Hope do this.


2.4) What about the performance of functional programs?
-------------------------------------------------------
In some circles, programs written in functional languages, have
obtained a reputation for lack of performance.  Part of this results
from the high-level of abstraction that is common in such programs
and from powerful features like higher-order functions, automatic
storage management, etc.  Of course, the performance of functional
languages keeps improving with new developments in compiler
technology.

The paper below compares five current implementations of lazy
functional languages:

  ``Benchmarking implementations of lazy functional languages''
  P. H. Hartel and K. G. Langendoen FPCA 93, ACM, pp 341-349
  (By ftp: ftp.fwi.uva.nl, directory pub/functional).

Experiments with a heavily optimising compiler for Sisal, a strict
functional language, show that functional programs can be faster
than Fortran:

  ``Retire FORTRAN? A debate rekindled''
  D. C. Cann, CACM, 35(8), pp. 81-89, Aug. 1992


2.5) What is a purely functional language?
------------------------------------------
This question has been the subject of some debate in recent messages
posted to comp.lang.functional.  It is widely agreed that languages
like Haskell and Miranda are `purely functional', while SML and
Scheme are not.  However, there are some small differences of
opinion about the precise technical motivation for this distinction.
One definition that has been suggested is as follows:

  The term `purely functional language' is often used to describe
  languages which perform all their computations via function
  application.  This is in contrast to languages, like Scheme and
  Standard ML, which are predominantly functional but also allow
  `side effects' (computational effects caused by expression
  evaluation which persist after the evaluation is completed).

  Sometimes, the term `purely functional' is also used in a broader
  sense to mean languages which might incorporate computational
  effects, but without altering the notion of `function' (as
  evidenced by the fact that the essential properties of functions
  are preserved.)  Typically, the evaluation of an expression can
  yield a `task' which is then executed separately to cause
  computational effects.  The evaluation and execution phases are
  separated in such a way that the evaluation phase does not
  compromise the standard properties of expressions and functions.
  The input/output mechanisms of Haskell, for example, are of this
  kind.


2.6) Other subjects:
--------------------
There probably ought to be something here about programming with
GUIs (Fudgets, eXene, etc.), Input/Output, General Foundations
(basics of lambda calculus, perhaps?), and parallelism.  Anybody
want to write some brief comments addressing one/some of these?
(Some sections are already in preparation.)


---------------------------------------------------------------------------
3) LANGUAGE IMPLEMENTATIONS:

ASpecT:		ASpecT is a strict functional language, developed at
		the University of Bremen, originally intended as
		an attempt to provide an implementation for (a
		subset of) Algebraic Specifications of Abstract
		Datatypes.  The system was designed to be as
		user-friendly as possible, including overloading
		facilities and a source-level debugger.  Efficiency
		called for call-by-value evaluation and reference
		counting memory management.

		Over the years more and more features were added,
		including subsorting, functionals and restricted
		polymorphism. The ASpecT compiler translates the
		functional source code to C, resulting in fast and
		efficient binaries.

		The most important application of ASpecT to date
		is the interactive graph visualization system
		daVinci; currently (Oct '93), version 1.2 is composed
		of 23.000 lines of code. For more information please
		contact the project daVinci by e-mail:
		daVinci@Informatik.Uni-Bremen.DE

		ASpecT is available by anonymous FTP from
		wowbagger.PC-Labor.Uni-Bremen.DE in the directory
		/pub/lang/ASpecT. ASpecT has been ported to many
,
		NeXT, Apple A/UX, PC (OS/2, Linux), Amiga and Atari
		ST/TT.


Caml Light:     Caml Light is an implementation of the ML language
		that does not comply to the Standard, but is
		distinguished by its small size, modest memory
		requirements, availability on microcomputers, simple
		separate compilation, interface with C, and portable
		graphics functions.

		Caml Light 0.6 runs on most Unix machines, on the
		Macintosh and on PCs under MSDOS.

		ftp: ftp.inria.fr, directory lang/caml-light


Clean:          The Concurrent Clean system is a programming
		environment for the functional language Concurrent
		Clean, developed at the University of Nijmegen,
		The Netherlands. The system is one of the fastest
		implementations of functional languages available
		at the moment. Its I/O libraries make it possible
		to do modern, yet purely functional I/O (including
		windows, menus, dialogs etc.) in Concurrent Clean.
		With the Concurrent Clean system it is possible to
		develop real-life applications in a purely functional
		language.  Particular features include:

		  o lazy and purely functional
		  o strongly typed - based on Milner/Mycroft scheme
		  o module structure
		  o modern I/O
		  o programmer-influenced evaluation order by
                    annotations

		ftp: host ftp.cs.kun.nl,  directory pub/Clean
		available for: Mac, Sun 3, Sun 4

		There is a book describing Concurrent Clean and
		its implementation on sequential and parallel
		architectures:

		"Functional Programming and Parallel Graph Rewriting",
		Rinus Plasmeijer and Marko van Eekelen,
		Addison Wesley, International Computer Science Series.
		Hardcover, 571 pages.
		ISBN 0-201-41663-8


Erlang:		Concurrent functional programming language for
		large industrial real-time systems. Untyped.
		Pattern matching syntax.  Recursion equations.
		Explicit concurrency, asynchronous message
		passing.  Relatively free from side effects.
		Transparent cross-platform distribution.  Primitives
		for detecting run-time errors.  Real-time GC.
		Modules.  Dynamic code replacement (change code
		in running real-time system, without stopping
		system).  Foreign language interface.

		Availability: Free version (subject to non-commercial
		license) with no support.  Commercial versions
		with support are available (Erlang Systems AB).

		Info: erlang@erix.ericsson.se
		FTP Info: euagate.eua.ericsson.se:/pub/eua/erlang/info

		See also:
		"Concurrent Programming in Erlang", J. Armstrong,
		M. Williams & R. Virding, Prentice Hall, 1993.
		ISBN 13-285792-8.


FP:             Backus' side-effect free, combinator style language
		described by:

		"Can Programming be Liberated from the Von
		Neumann Style?", J. Backus, Communications of the
		ACM, 21, 8, pp.613-641, 1978.

		There are (at least) three easily accessible
		implementations of FP.  Two of these are available
		from any site that archives comp.sources.unix.
		For example, at gatekeeper.dec.com you will find
		these in:

		 pub/usenet/comp.sources.unix/volume13/funcproglang
		 pub/usenet/comp.sources.unix/volume20/fpc

		The first of these is an interpreter, the second a
		translator from FP to C.

		The third implementation, IFP is described separately
		below.


Gofer:		The Gofer system provides an interpreter for a small
		language based closely on the current version of
		the Haskell report.  In particular, Gofer supports
		lazy evaluation, higher-order functions, polymorphic
		typing, pattern-matching, support for overloading, etc.

		ftp: nebula.cs.yale.edu,  directory: pub/haskell/gofer

		Gofer runs on a wide range of machines including
		PCs, Ataris, Amigas, etc.  as well as larger
		Unix-based systems.  A version for the Apple
		Macintosh has been produced and is available by
		anonymous ftp from ftp.dcs.glasgow.ac.uk in a
		subdirectory of pub/haskell/gofer.

		Please note the spelling, derived from the notion
		that functional languages are GOod For Equational
		Reasoning.  This is not to be confused with `Gopher',
		the widely used Internet distributed information
		delivery system!


Haskell:	In the mid-1980s, there was no "standard" non-strict,
		purely-functional programming language.  A
		language-design committee was set up in 1987, and
		the Haskell language is the result.

		The Haskell committee released its report on 1
		April 1990. A revised "Version 1.2" appeared in
		SIGPLAN Notices 27(5) (May 1992), along with a
		tutorial on Haskell by Hudak and Fasel.

		At the time of writing, there are three different
		Haskell systems available, developed by groups at
		Chalmers, Glasgow and Yale (several others are
		being developed).  These systems are available
		from the following sites:
		   Chalmers	ftp.cs.chalmers.se
		   Glasgow	ftp.dcs.glasgow.ac.uk
		   Yale		nebula.cs.yale.edu
		At each site, all of the files related to Haskell
		are stored in the directory pub/haskell.  Specialized
		material, or recent releases of these systems may
		sometimes only be available from the systems ``home
		site''.  Machine-readable versions of the Haskell
		report, tutorials, and some programs are also
		available at these sites.

		A description of the current status of the various
		Haskell implementations is occasionally posted on
		the Haskell mailing list, and sometimes on
		comp.lang.functional.  Copies of this document are
		often kept on the Haskell sites mentioned above.
		For example, this information may be found in
		pub/haskell/papers/Haskell.status at the Yale site
		(nebula.cs.yale.edu).


Hope:		A small polymorphically-typed functional language.
		First language to use call-by-pattern.	Hope was
		originally strict, but there are versions with lazy
		lists, or with lazy constructors but strict functions.
		A fully lazy interpreter is available from:

		ftp: santos.doc.ic.ac.uk:/pub/papers/R.Paterson/hope.tar.Z


Id:             The core of Id is a non-strict functional language
		with implicit parallelism.  It has the usual features
		of many modern functional languages, including a
		Hindley/Milner type inference system, algebraic
		types and definitions with clauses and pattern
		matching, and list comprehensions.


IFP:            The Illinois FP system is a modified version of
		Backus' FP with a more Algol-like syntax and
		structure.  Described in:

		"The Illinois Functional Programming Interpreter",
		Arch D. Robison, Proceedings of the SIGPLAN '87
		Symposium on Interpreters and Interpretive Techniques,
		SIGPLAN notices vol 22, no 7, July 1987.

		ftp: a.cs.uiuc.edu.    versions for Unix and MSDOS


J:              J was designed and developed by Ken Iverson and
		Roger Hui.  It is similar to the language APL,
		departing from APL in using using the ASCII alphabet
		exclusively, but employing a spelling scheme that
		retains the advantages of the special alphabet
		required by APL. It has added features and control
		structures that extend its power beyond standard
		APL.  Although it can be used as a conventional
		procedural programming language, it can also be
		used as a pure functional programming language.

		ftp: watserv1.waterloo.edu.


Miranda(TM):    Miranda was designed in 1985-6 by David Turner with
		the aim of providing a standard non-strict purely
		functional language.  It is described in D. A.
		Turner ``Miranda: A Non-Strict Functional Language
		with Polymorphic Types'', Proceedings FPLCA, Nancy,
		France, September 1985 (Springer LNCS vol 201, pp
		1-16) and D. A. Turner ``An Overview of  Miranda'',
		SIGPLAN Notices, vol 21, no 12, pp 158-166 (December
		1986).

		Miranda was the first widely disseminated language
		with non-strict semantics and polymorphic strong
		typing, and is now running at over 600 sites,
		including 250 universities.  It is widely used for
		teaching, often in conjunction with "Introduction
		to Functional Programming", by Bird & Wadler, which
		uses a notation closely based on Miranda.

		It has also had a strong influence on the subsequent
		development of the field and provided one of the
		main inputs for the design of the later language
		Haskell (see separate entry).

		Miranda was awarded a medal for technical achievement
 Computer Society (BCS Awards, 1990).

		The Miranda system is a commercial product of
		Research Software Limited.  Miranda release two
		(the current version) supports unbounded precision
		integers and has a module system with provision
		for parameterized modules and a built in "make"
		facility.  The compiler works in conjunction with
		a screen editor and programs are automatically
		recompiled after edits.  There is an online reference
		manual.

		Note that the word "Miranda" is a trademark (TM)
		of Research Software Limited.  There are no public
		domain versions of Miranda.

		Further information about Miranda may be obtained
		from
                   mira-request@ukc.ac.uk
                or
                   Research Software Ltd
                   23 St Augustines Road
                   Canterbury CT1 1XP       phone: (+44) 227 471844
                   ENGLAND                  fax:   (+44) 227 454458


ML:             ML (which stands for Meta-Language) is a family of
		advanced programming languages with [usually]
		functional control structures, strict semantics,
		a strict polymorphic type system, and parameterized
		modules.  It includes Standard ML, Lazy ML, CAML,
		CAML Light, and various research languages.
		Implementations are available on many platforms,
		including PCs, mainframes, most models of workstation,
		multi-processors and supercomputers.  ML has many
		thousands of users, is taught at many universities
		(and is the first programming language taught at
		some).

		There is a moderated usenet newsgroup, comp.lang.ml,
		for the discussion of topics related to ML.  A list
		of frequently asked questions for ML is posted to
		this group each month by the moderator, Greg
		Morrisett.  The first paragraph above is taken
		directly from this FAQ.

		There are several implementations of ML including
		Poly/ML, SML/NJ, PoplogML, Edinburgh, ANU ML, Micro
		ML, sml2c, Caml Light, and the ML kit.  Further
		details for each of these systems are included in
		the comp.lang.ml FAQ.

		The Standard ML language is formally defined by:

		"The Definition of Standard ML", Robin Milner, Mads
		Tofte and Robert Harper, MIT, 1990.  ISBN:
		0-262-63132-6

		"Commentary on Standard ML", Robin Milner and Mads
		Tofte, MIT, 1991 ISBN: 0-262-63137-7

		There are a number of texts describing programming
		in ML.  Again, full details are given in the
		comp.lang.ml FAQ.


NESL:		NESL is a fine-grained, functional, nested
		data-parallel language.  The current implementation
		runs on workstations, the Connection Machines CM2
		and CM5, the Cray Y-MP and the MasPar MP2.

		NESL is loosely based on ML.  It includes a built-in
		parallel data-type, sequences, and parallel operations
		on sequences (the element type of a sequence can
		be any type, not just scalars).  It is based on
		eager evaluation, and supports polymorphism, type
		inference and a limited use of higher-order functions.
		Currently it does not have support for modules and
		its datatype definition is limited.  Except for
		I/O and some system utilities it is purely functional
		(it does not support reference cells or call/cc).
		The compiler is based on delayed compilation and
		compiles separate code for each type a function is
		used with (compiled code is monomorphic).  The
		implementation therefore requires no type bits,
		and can do some important data-layout optimizations
		(e.g. double-precision floats don't need to be
		boxed, and nested sequences can be laid out
		efficiently across multiple processors).  For
		several small benchmark applications on irregular
		and/or dynamic data (e.g graphs and sparse matrices)
		it generates code comparable in efficiency to
		machine-specific low-level code (e.g. Fortran or C).

		The system is available via anonymous FTP to
		nesl.scandal.cs.cmu.edu (currently 128.2.222.128),
		in the file code/nesl/nesl.tar.Z (1.2Mbytes).
		There is a README file in the nesl directory that
		contains further information.  You can be added to
		the NESL mailing list by sending e-mail to
		nesl-request@cs.cmu.edu.  The examples and
		documentation are also available separately.


OPAL:		The language OPAL has been designed as a testbed
		for the development of functional programs. Opal
		molds concepts from Algebraic Specification and
		Functional Programming, which shall favor the
		(formal) development of (large) production-quality
		software that is written in a purely functional
		style.

		The core of OPAL is a strongly typed, higher-order,
		strict applicative language which belongs to the
		tradition of HOPE and ML. The algebraic flavour of
		OPAL shows up in the syntactical appearance and
		the preference of parameterization to polymorphism.

		OPAL is used for research on the highly optimizing
		compilation of applicative languages. This has
		resulted in a compiler which produces very efficient
		code. The OPAL compiler itself is entirely written
		in OPAL.

		Papers describing OPAL, and the OPAL compilation
		system itself, are available by anonymous ftp from:

			ftp.cs.tu-berlin.de

		This includes an overview of OPAL in the file:

		    pub/local/uebb/papers/DesignImplOpal.ps.gz

		A language tutorial:

		    pub/local/uebb/papers/TutorialOpal.ps.gz

		The compilation system is in the pub/local/uebb/ocs
		directory.  Installation is straightforward and
		has been successfully performed for SPARCs,
		DECstations, NeXTs, and PCs running LINUX.


Scheme:		Scheme is a dialect of Lisp that stresses conceptual
		elegance and simplicity. It is specified in R4RS
		and IEEE standard P1178. (See question [1-7] for
		details on standards for Scheme.) Scheme is much
		smaller than Common Lisp; the specification is
		about 50 pages.

		Scheme is often used in computer science curricula
		and programming language research, due to its
		ability to represent many programming abstractions
		with its simple primitives.

		There is an unmoderated usenet newsgroup,
		comp.lang.scheme for the discussion of topics
		related to Scheme, and a list of frequently asked
		questions for Scheme is posted to the group each
		month by Mark Kantrowitz.  The FAQ list is also
		available online from several sources; for example,
		it can be obtained by anonymous ftp from ftp.think.com
		in the file /public/think/lisp/scheme-faq.text.

		There are many books and papers dealing with Scheme.
		Please consult the comp.lang.scheme frequently
		asked questions list for further details.

		The Scheme Repository, maintained by Ozan S. Yigit,
		is accessible by anonymous ftp at nexus.yorku.ca
		[130.63.9.66] in the directory pub/scheme/, and
		contains a Scheme bibliography, copies of the R4RS
		report, IEEE P1178 specification and other papers,
		sample Scheme code for a variety of purposes,
		several utilities, and some implementations.  The
		repository is mirrored in INRIA, courtesy of
		Christian Queinnec [Ecole Polytechnique and
		INRIA-Rocquencourt], ftp.inria.fr:lang/Scheme.


Sisal:          Sisal (Streams and Iteration in a Single Assignment
		Language) is a functional language designed with
		several goals in mind:  to support clear, efficient
		expression of scientific programs; to free application
		programmers from details irrelevant to their
		endeavors; and, to allow automatic detection and
		exploitation of the parallelism expressed in source
		programs.

		Sisal syntax is modern and easy to read; Sisal code
		looks similar to Pascal, Modula, or Ada, with modern
		constructs and long identifiers. The major difference
		between Sisal and more conventional languages is
		that it does not express explicit program control flow.

		Sisal semantics are mathematically sound. Programs
		consist of function definitions and invocations.
		Functions have no side effects, taking as inputs
		only explicitly passed arguments, and producing
		only explicitly returned results. There is no
		concept of state in Sisal.  Identifiers are used,
		rather than variables, to denote values, rather
		than memory locations.

		The Sisal language currently exists for several
		shared memory and vector systems that run Berkeley
mmetry,
		the Alliant, the Cray X/MP and Y/MP, Cray 2, and
		a few other less well-known ones.  Sisal is available
		on sequential machines such as Sparc, RS/6000, and
		HP.  Sisal also runs under MS-DOS and Macintosh
		Unix (A/UX). It's been shown to be fairly easy to
		port the entire language system to new machines.

		ftp: sisal.llnl.gov (128.115.19.65)

		For more information, pleases send an email request to:
			sisal-info-request@sisal.llnl.gov

		See also: "Retire FORTRAN? A debate rekindled",
		David Cann, CACM, 35(8), pp.81-89, Aug 1992


---------------------------------------------------------------------------
4) OTHER RESOURCES:

4.1) Bibliographies:

  o  Mike Joy maintains a bibliography on Functional Languages,
     in refer(1) format.  It is available by anonymous ftp from:
     ftp.dcs.warwick.ac.uk in the files:

       pub/biblio/functional.README pub/biblio/functional.refer.Z

  o  Tony Davie maintains a bibliography of over 2,600 papers,
     articles and books on functional programming and functional
     systems.  It can be obtained by anonymous ftp from
     tamdhu.dcs.st-and.ac.uk in the directory pub/staple, either
     as a hypercard stack in pubs.sit.Hqx, or as a (compressed)
     text file in pubs.txt.Z.

  o  Wolfgang Schreiner has compiled an annotated bibliography
     on parallel functional programming that lists more than 350
     publications mostly including their *full abstracts*.

     You can retrieve the bibliography by anonymous ftp from
     ftp.risc.uni-linz.ac.at (193.170.36.100) in
     pub/reports/parlab/pfpbib2.dvi.Z (or pfpbib2.ps.Z).

  o  State in Functional Programming: An Annotated Bibliography,
     edited by P. Hudak and D. Rabin, is available by anonymous
     ftp from nebula.cs.yale.edu in the files:

       pub/yale-fp/papers/state-bib.<format>.<compression> where
       <format>      ::= ps | dvi
	     <compression> :: = z | Z


4.2) Translators:

  o  Miranda(TM) to LML and Miranda(TM) to Haskell translators
     written by Denis Howe are available by anonymous ftp from
     wombat.doc.ic.ac.uk (146.169.22.42) in directory pub, files
     mira2hs-1.05 and mira2lml-0.00


4.3) Online services:

  o If you have wais, the source is listed below, or it can be
    easily obtained from the directory-of-servers. If you don't
    have wais, subscribe to comp.infosystems.wais and find someone
    to ask.

    (:source
       :version  3 :ip-address "137.219.17.4" :ip-name
       "coral.cs.jcu.edu.au" :tcp-port 8000 :database-name
       "Func-Prog-Abstracts" :cost 0.00 :cost-unit :free :maintainer
       "farrell@coral.cs.jcu.edu.au" :description "Server created
       with WAIS release 8 b3.1
	 on Apr 22 19:06:25 1992 by farrell@coral.cs.jcu.edu.au

     Keywords: help intro introduction info information computer
	science technical reports functional programming

     This is a small collection of computer science technical
     reports, abstracts and papers gathered from ftp sites etc.
     all over the world. Due to space considerations, I am limiting
     it to functional programming, my area of interest, and papers
     produced by the department (which may or may not be related
     to functional programming).

     Comments, problems etc to the maintainer above.  " )


  o The Free On-Line Dictionary of Computing is available by Gopher
    and FTP from wombat.doc.ic.ac.uk.  It is not restricted to
    functional programming but does include quite a few FP terms.


---------------------------------------------------------------------------
5) CREDITS AND DISCLAIMERS:

The information in this article has been taken from public sources,
mostly from articles posted on comp.lang.functional during the past
eighteen months.  This FAQ includes contributions from many different
people -- because of the way that the FAQ was compiled, I regret
to say that I do not have a complete list of contributors.

The aim of this FAQ is to provide information about functional
languages and to reflect widely held views in the functional
programming community.  Any opinions expressed in this message are
those of the individual contributors, and may not be representative
either of my own personal views, or of others in the community.

It is very likely that this FAQ contains some significant errors
and omissions: There are no guarantees for the accuracy of the
information provided here.  Of course, your corrections and
contributions are encouraged!


---------------------------------------------------------------------------
