Miranda

Miranda: Un Linguaggio per la Programmazione Funzionale

Quest'introduzione a Miranda fu creata da Farhanah Akilwala e Kimberly Blessing per il loro corso nei Linguaggi di Programmazione al Bryn Mawr College.


MIRANDA è un linguaggio di programmazione di stile nuovo, progettato da David A. Turner all'Università di Kent negli anni ottanta. I linguaggi di programmazione funzionali di stile nuovo, come per esempio MIRANDA (ed altri come ML e Haskell), si distinguono per il metodo con cui passano i parametri: i linguaggi dello stile nuovo chiamano per bisogno, o per la valutazione pigra, a differenza del metodo chiama-per-valore dei linguaggi funzionali dello stile vecchio (come LISP).

I programmi, che in MIRANDA si chiamano script, consistono di funzioni e di strutture di dati, scritti sotto forma di equazioni ricorsive. Un esempio di uno script sarebbe:

        z = sq x / sq y
        sq n = n * n
        x = a + b
        y = a - b
        a = 10
        b = 5

Come si vede nel soprastante esempio, dei separatori fra le dichiarazioni ("statement") non sono necessari perché l'algoritmo per la comprensione del linguaggio ("parsing"), che dipende dalla struttuta a blocchi, fa un'uso intelligente della disposizione del testo. Non solo, ma l'organizzazione del codice, perlopiù, non è significativo.

Le cose viste più spesso in MIRANDA sono le liste, che si scrivono come:

        relatives = ["Mom"; "Dad", "Sis", "Bro"]

Le operazioni che si possono effettuare sulle liste sono: l'addizione e la sottrazione (++ e --, rispettivamente), prendere la lunghezza di una lista (#), la costruzione ("cons" in inglese) delle liste (:), e la sottoscrizione ("subscripting") delle liste (!). In una serie aritmetica, la notazione ".." sta ad indicare "fino a".

Gli elementi di una lista devono essere tutti dello stesso tipo. Una sequenza di elementi di tipi diversi si chiama una tuple, una cosa simile ad un record in Pascal, ma più conciso.

Inoltre, MIRANDA fa uso di guardie, che sono delle espressioni booleani che funzionano più o meno come gli if-then-else.

        distanza x y  = distanza (x - y), x > y
                      = distanza (y - x), x < y
                      = 0, x = y

Il combaciamento degli schemi ("pattern matching") permette di definire una funzione dando diverse equazioni diverse che abbiano dei parametri formali diverse. Come si vede, è anche più conciso rispetto all'uso di guardie:

        fac 0 = 1
        fac (n + 1) = (n + 1) * fac n

In MIRANDA, le funzioni possono essere passate come parametri e restituiti come risultati. Le funzioni che prendono 2 o più parametri sono delle funzioni di ordine superiore, il ché significa che ogni funzione prende un solo parametro e restuisce un'altra funzione.

        pitag 3 4          ||pitag è una funzione che prende il
        (pitag 3) 4        ||parametro 3 e si evalua in una funzione
        f 4                || f, che trova l'ipotenusa di qualunque
                           ||triangolo retto cui base è di lunghezza 3

MIRANDA comprende le espressioni ZF, che fanno uso della notazione della teoria degli insiemi. La forma generale di un'espressione ZF è: [ corpo | qualificatori ] Un'esempio sarebbe:

        pitag = {[a, b, c] | a, b, c <- [1 .. ]; a*a + b*b = c*c}

Questo ci permette di definire un'insieme infinito e si leggerebbe: "la lista di tutti gli a, b, c tale che a, b, c tratte dalla lista di 1 all'infinità; e che soddifacciano l'espressione Pitagorica."

Con il meccanismo dell'evauazione pigro, implementato nei linguaggi di programmazione di stile nuovo, nessuna sottoespressione viene valutata a meno che il suo valora non sia richiesta. Questo lo rende possibile di definire delle funzioni non stretti, che sono in grado di restituire una risposta perfino se uno dei loro parametri sia indefinito. Ad esempio:

        if True x y = x
        if False x y = y
il ché si puo utilizzare in una situazione come
        if (x = 0) 0 (1/x)

In MIRANDA, le dichiarazioni di tipo non sono necessari perché il compilatore è in grado di dedurre il tipo di una funzione dall'equazione che lo definisce. In ogni caso, la notazione (::) si rende molto utile quando si deve definire dei tipo polimorfici, che permette la definizione di una funzione senza specificare il tipo di parametro e di evitare di dover redefinire la stessa funzione più volte con tipi di parametri diversi. Per esempio:.

        riversa :: [*] -> [*]
in cui una lista di qualunque tipo viene riversata.

I tipi definiti dall'utente vengono create in un'equazione utilizzando "::=" e possono essere polimorfici: gli oggetti di tipi definiti dall'utente vengono analizzati usango il combaciamenti degli schemi ("pattern matching"). Un esempio potrebbe essere:

        colore_bandiera ::= Rosso | Bianco | Verde

MIRANDA, oltre a permettere i tipi concreti, provvede anche i tipi di dati astratti. La definizione di un ADT si divide in due parti, cominciando con una dichiarazione nella forma abstipo with in cui i nomi che sguono li with sono le firme dell'ADT che legherà l'ADT al resto del programma. L'insieme di equazioni legate all'ADT dalle loro firme si chiamano equazioni d'implementazione.

Referenze:
The Anatomy of Programming Languages. Fischer and Grodzinsky. Prentice Hall, NJ. 1993.
"An Overview of Miranda"; David Turner; Ristampato da SIGPLAN NOTICES, December 1986.
"Functional programs as executable specifications"; D.A. Turner, Mathematic Logic and Programming Languages. ed. Hoare and Shephardson. Prentice Hall.
"Miranda: A non-strict functional language with polymorphic types"; D.A. Turner; Springer Lecture Notes in Computer Science, vol. 201.


Ulteriori informazioni sul sistema Miranda, compresi l'elenco dei sistemi di computer per cui è disponibile e le tarriffe attuali, si possono avere per posta, email o telefono, da:

Research Software Limited
23, St Augustines Road,
Canterbury
Kent CT1 1XP
ENGLAND

Telefono (24 ore) +44 227 471844
email: mira-request@ukc.ac.uk
uucp: mcvax!ukc!mira-request
internet: mira-request%ukc@nsfnet-relay.ac.uk


Aggiunte del 05 Marzo 2001:
Miranda: The Craft of Functional Programming

Questo sito web fu creato da:
Kimberly Blessing / kimberly@blackcat.brynmawr.edu / URL = http://blackcat.brynmawr.edu/~kimberly/Miranda.html
e tradotto da: Martin Guy <martinwguy@gmail.com>