Declarative Programming
-----------------------
The essence of the declarative programming paradigm is that we tell the computer
what we want, not how to go about doing it. For example, the APL function for
the mean item of a vector: {(+⌿⍵)÷≢⍵} declares the mean to be the quotient of
the sum and number of items. Contrast this with the coding in a typical proced-
ural language, where we are obliged to determine the sequence of operations:
rslt = mean(vec length):
sum = 0
index = 0
while index < length
sum = sum + vec[index]
rslt = sum ÷ length
The penultimate line: sum = sum + ... is particularly thought-provoking:
There is a story that Ken Iverson, the inventor of APL, was passing a terminal
at which a Fortran programmer had just typed:
I = I+1
Ken paused for a moment, muttered "no it doesn't", and passed on.
A similar yarn relates to a computer scientist who, many years ago, before the
concept of declarative programming was generally understood, was teaching prog-
ramming to a group of geography students. The students were having a hard time
understanding what I=I+1 means. To his immense credit, on reflection, the teach-
er realised that he didn't understand either. Thus came a significant advance in
computer science.
(muse:
Stupid questions ...
During the time we were implementing the very first version of Dyalog, a
friend, who was not a programmer, asked me how much of it was coded in APL.
I thought he was bonkers.
We now have exactly this internal "magic function" prototyping facility.
When "Visual Display Units" first appeared alongside scrolling paper termin-
als, a participant on a course I was giving asked me where the writing went
when it disappeared off the top of the screen. I explained it was just,
well, gone; same place the ticking goes when the clock stops.
We now have scrolling sessions.
On another course, someone asked me what (A B) means, when A and B are vari-
ables. I explained that it didn't mean anything as there wasn't a function
between the A and the B.
We now have vector notation.
Sound bite: A stupid question is a portal into an alternative mindset.
)
Note however, in a lazy functional language such as Haskell, min.dws or max.dws,
statements such as i=i+1 have meaning. For example, in max, we can say:
max'' ⍝ start max session.
i = +i / declare i to be its own successor.
i:: / the type of i is "num".
#
/ However, a problem occurs if we try to display the value of i
/ by reducing it to a number: the reduction fails to terminate
/ as max tries to display a number that is its own successor.
i / this will not terminate !!!
... INTERRUPT
FP theorists assign a special symbol "⊥", pronounced "bottom" to non-termination
in order that they can reason about expressions containing such values.
Computer scientist P.J.Landin preferred the term "denotative" to "declarative":
The word "denotative" seems more appropriate than nonprocedural, declarative
or functional. The antithesis of denotative is "imperative".
The Next 700 Programming Languages, Landin,P.J., Comms ACM 9.3, March 1966.
And finally: "Some people prefer not to commingle the functional, lambda-
calculus part of a language with the parts that do side effects. It seems they
believe in the separation of Church and state." -- Guy Steele
See also: pearly
Back to: contents
Back to: Workspaces