Script
Definizioni e dichiarazioni
L’uso dell’interprete ghci
come calcolatrice va bene per la
valutazione di semplici espressioni. Quando si scrive un programma
complesso lo si inserisce in uno script, ovvero un file di testo
con estensione .hs
che contiene un insieme di definizioni.
Una definizione è un’associazione tra un nome N ed una espressione E. All’interno di uno script, è possibile fare riferimento al valore dell’espressione E scrivendone il nome associato N.
Usando un editor di testo, definiamo lo script PrimoScript.hs
con
il seguente contenuto:
anno_terra :: Float
anno_terra = 2 * pi * 150e6
v_terra :: Float
v_terra = anno_terra / (365 * 24)
Ogni definizione è preceduta da una dichiarazione della
forma N :: T
dove N
è il nome della definizione e T
il suo
tipo. Qui sopra abbiamo 2 definizioni, una per il nome anno_terra
e una per il nome v_terra
, entrambe di tipo Float
, il tipo dei
numeri in virgola mobile a precisione singola. Ogni dichiarazione è
seguita dalla definizione vera e propria della forma N = E
, in cui
si stabilisce che N
è il nome per il valore dell’espressione
E
. Il valore di anno_terra
è il valore dell’espressione 2 *
pi * 150e6
che calcola, in maniera approssimativa, la lunghezza in
chilometri dell’orbita terrestre, approssimandola a un cerchio di
raggio 150e6
chilometri (si ricordi che la notazione 150e6
significa 150 moltiplicato per 10 elevato alla 6, ovvero 150 milioni
di chilometri). Il nome pi
corrisponde al valore (approssimato)
di pi greco. Il valore di v_terra
è la velocità approssimativa
della Terra nel suo moto attorno al Sole, qui determinata dividendo
la lunghezza dell’orbita per il tempo di percorrenza in ore.
Caricamento di script
Per poter usare le definizioni contenute all’interno di uno script
occorre prima caricarlo all’interno di ghci
. Supponendo di
aver aperto un terminale e di trovarsi nella stessa cartella in cui
è stato salvato lo script che si vuole caricare, questo si può
ottenere in vari modi.
Si può lanciare ghci
indicando direttamente dalla linea di comando
il nome dello script da caricare:
ghci PrimoScript.hs
In alternativa, si può lanciare ghci
senza argomenti
ghci
e poi caricare lo script dall’interno di ghci
stesso:
Prelude> :load PrimoScript.hs
Una volta che lo script è stato caricato, è possibile usare i nomi definiti al suo interno semplicemente scrivendone il nome. Intuitivamente, il nome di una definizione viene sostituito dal suo valore:
anno_terra
v_terra
Modifica di script
Quando si sviluppano programmi complessi è frequente che lo script su cui si lavora contenga degli errori, o comunque che le definizioni inserite non corrispondano sempre con quelle attese. In generale, la programmazione in Haskell prevede l’uso di due programmi, in due finestre diverse:
- l’editor di testo con cui si modifica lo script
- il terminale all’interno del quale si esegue
ghci
Dopo ogni modifica, lo script deve essere ricaricato inghci
affinché le modifiche abbiano effetto. Questo si può ottenere usando
i comandi già illustrati in precedenza, oppure semplicemente usando
il comando :reload
o :r
al prompt di ghci
.
Esercizi
- Aggiungere a
PrimoScript.hs
le definizioni per i nomianno_mercurio
ev_mercurio
tenendo conto che Mercurio dista dal Sole circa 58 milioni di chilometri e impiega circa 88 giorni terrestri per compiere un’orbita. Usare il comando:r
per ricaricare lo script dopo averlo modificato.anno_mercurio :: Float anno_mercurio = 2 * pi * 58e6 v_mercurio :: Float v_mercurio = anno_mercurio / (88 * 24)
- La sequenza di Fibonacci inizia con i numeri 0 e 1 e ogni numero
successivo è ottenuto sommando i due immediatamente
precedenti. Dunque, i primi otto numeri nella sequenza di
Fibonacci sono 0, 1, 1, 2, 3, 5, 8, 13, 21. Il seguente script
Haskell definisce i nomi
f0
,f1
ef2
per i primi tre numeri nella sequenza di Fibonacci.f0 :: Int f0 = 0 f1 :: Int f1 = 1 f2 :: Int f2 = f0 + f1
Si noti l’uso del tipo
Int
per la dichiarazione di nomi il cui tipo è un numero intero. Aggiungere allo script le definizioni per i nomi daf3
af7
. Usareghci
per verificare che tali nomi siano effettivamente associati al corrispondente numero nella sequenza di Fibonacci.f0 :: Int f0 = 0 f1 :: Int f1 = 1 f2 :: Int f2 = f0 + f1 f3 :: Int f3 = f1 + f2 f4 :: Int f4 = f2 + f3 f5 :: Int f5 = f3 + f4 f6 :: Int f6 = f4 + f5 f7 :: Int f7 = f5 + f6