Perché le funzioni scala sono limitate a 22 parametri?

Non che in realtà mi sia avvicinato a quel limite, ma mi sono sempre chiesto: perché si fermano a Function22 / Tuple22 . Restrizione JVM? Scelta arbitraria?

Le funzioni e le tuple vengono riscritte come oggetti dal compilatore e vengono definite solo da Function0 a Function22 e da Tuple0 a Tuple22 . Penso che il limite di 22 sia del tutto arbitrario, ma la ragione per avere un limite non lo è.

Pensalo in questo modo: per eseguire un’applicazione Scala è necessario che siano presenti le classi necessarie per eseguirlo. Se il compilatore crea dynamicmente le classi per le funzioni, quelle classi non verrebbero incluse nel JAR della libreria Scala, quindi dovresti includerle nella tua applicazione. Potrebbe funzionare, ma in questo caso avresti il ​​problema di quali dovrebbero essere i nomi completi delle classi: se fossero uguali per tutte le app, avresti scontri poiché le librerie avrebbero le stesse classi e se i nomi non fossero lo stesso si finirebbe con incompatibilità – funzioni da librerie non sarebbero le stesse funzioni nella tua app.

Non esiste un limite del genere. Anche se le librerie standard definiscono fino a Function22, è ansible definire Function23 se necessario, fino al limite JVM. Oppure puoi raggruppare argomenti in tuple. Oppure potresti semplicemente smettere di fingere che qualsiasi funzione richieda più di un argomento:

 a => b => c => d => e => ... 

Le funzioni elaborate possono prendere tutti gli argomenti che vuoi.

È per lo più arbitrario, ma ci sono alcuni limiti sottostanti alla JVM che determinano approssimativamente ciò che il limite deve essere.

Il problema principale è la corrispondenza del modello sulle classi dei casi. Se una class di casi consentiva di essere molto più grande, il codice di corrispondenza del pattern generato poteva facilmente superare la dimensione massima del metodo valida. Tutto il resto (Prodotto, Funzione, Tupla, …) segue solo il limite di 22 parametri che è stato scelto per le classi del caso.

Inoltre … Se stai scrivendo funzioni / tuple con> 22 parametri allora probabilmente sei in ritardo per una riprogettazione 🙂

Scelta arbitraria. Anche se queste classi sono generate automaticamente, ci deve essere un limite da qualche parte.

Nota che puoi avere qualcosa come “tuple di dimensioni arbitrarie” usando le liste o costrutti simili (vedi http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html )