Se stai usando Scala (e in base al tag sto assumendo sei), una soluzione molto generico è quello di scrivere il codice della libreria contro la classe scala.math.Integral
tipo:
def naturals[A](implicit f: Integral[A]) =
Stream.iterate(f.one)(f.plus(_, f.one))
È inoltre possibile utilizzare limiti di contesto e Integral.Implicits
per la sintassi più bello:
import scala.math.Integral.Implicits._
def squares[A: Integral] = naturals.map(n => n * n)
Ora è possibile utilizzare questi metodi sia con Int
o Long
o BigInt
, se necessario, dal momento che le istanze di Integral
esiste per tutti loro:
scala> squares[Int].take(10).toList
res0: List[Int] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
scala> squares[Long].take(10).toList
res0: List[Long] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
scala> squares[BigInt].take(10).toList
res1: List[BigInt] = List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
Non c'è bisogno di modificare il codice della libreria: basta usare Long
o BigInt
dove trabocco è una preoccupazione e Int
altrimenti.
Pagherete alcune penali in termini di prestazioni, ma la genericità e la possibilità di rinviare la decisione -o-- BigInt
potrebbe valerne la pena.
Ciao Rex, grazie per la pronta risposta! Una soluzione ragionevole anche se potrebbe richiedere un ri-factoring. Quanto difficile diresti è la manomissione della classe di base Integer che aggiunge il flag di controllo del flusso eccessivo alle funzioni standard di "operatore" considerando il complesso sistema di tipi? – IODEV
Btw, riguardo a "" +? + "", C'è una conversione di nomi Scala che si dovrebbe usare?/Grazie in anticipo – IODEV
@IODEV - È possibile aggiungere una classe wrapper, ma non è possibile alterare sensibilmente la classe base perché in realtà esegue il mapping alla primitiva 'int' nella JVM e quindi ha un sacco di magia speciale del compilatore. La scelta di '' 'era arbitaria da parte mia; iniziando con '+' manterrai la precedenza dell'operatore uguale, e mi piace la simmetria (e gli altri fanno abbastanza in modo che mentre non lo chiamo un _convention_ è almeno familiare), quindi ho aggiunto un altro '+' alla fine . '+ @' funzionerebbe altrettanto bene. –