Nei linguaggi di programmazione funzionale, come Scala, i tipi di dati e le strutture, sono davvero importanti. Sono in due a proposito dell'uso di type-defs nell'aiutare la leggibilità del codice a manipolare strutture di dati non banali.
Ecco un esempio di una funzione che accetta una raccolta generica in Scala, la attraversa una volta in parallelo e calcola il suo valore medio. Qui ho usato un type-def semplicemente per non avere (Int,Int)
dappertutto:
def average(xs:GenTraversable[Int]):Int={
type IntTuple = (Int,Int)
def addIntTuples(x:IntTuple,y:IntTuple):IntTuple=(x._1+y._1,x._2+y._2)
val (sum,len)=xs.map(x=>(x,1))
.aggregate((0,0))(addIntTuples,addIntTuples)
sum/len
}
Ecco un'altra versione della funzione di cui sopra che tenta di dare al lettore un'idea migliore di ciò che la funzione sta facendo introducendo typedefs che indica cosa rappresentano i valori nella tupla.
def readableAverage(xs:GenTraversable[Int]):Int={
type Sum = Int
type Len = Int
type SumLen = (Sum,Len)
def add(x:SumLen,y:SumLen):SumLen=(x._1+y._1,x._2+y._2)
val (sum,len)=xs.map(x=>(x,1))
.aggregate((0,0))(add,add)
sum/len
}
La seconda versione è più lunga, ma forse offre al lettore più informazioni su come funziona la funzione. La domanda è: in primo luogo, consideri la seconda versione effettivamente più leggibile e perspicace? Se è così, è il vantaggio aggiunto vale la pena aumentare la lunghezza del codice ?