Mentre i linguaggi imperativi sono basati su istruzioni che modificano lo stato della macchina astratta, i linguaggi funzionali si basano su espressioni la cui valutazione produce dei valori. In particolare, ogni linguaggio di programmazine funzionale fornisce:
Per i linguaggi funzionali è comune disporre di un linguaggio interprete interattivo, detto real-eval-print loop (REPL) perchè è un programma che iterativamente (loop):
Per il linguaggio Scala è disponibile un REPL che può essere eseguito da riga di comando oppure tramite un IDE.
Se si inserisce nel REPL un’espressione, il REPL risponde indicandone il tipo e il valore:
scala> 12 + 24 * 2
res0: Int = 60
Ad esempio, in questo caso, Int
rappresenta il tipo intero, 60
è il valore dell’espressione. Inoltre, il REPL associa un nome al valore dell’espressione, qui res0
, che in seguito può essere utilizzato per far riferimento a tale valore:
scala> res0 + 20
res1: Int = 80
All’interno del REPL è anche possibile definire dei nomi associati a delle espressioni, usando la parola riservata def
seguita da un identificatore, dal simbolo =
e dall’espressione da associare:
scala> def radius = 10
radius: Int
scala> def pi = 3.14159
pi: Double
Si noti che questi non sono variabili (mutable), ma appunto nomi a cui sono associate delle espressioni non modificatibili. Si osservi inoltre che i tipi di queste definizioni non sono specificati esplicitamente, ma piuttosto vengono dedotti dall’interprete in base ai tipi delle espressioni specificate alla destra dell’uguale; dopo la valutazione di ciascuna definizione, il REPL ne mostra il tipo.
I nomi definiti possono essere usati in un’espressione: