L'inferenza di tipo Scala è basata sul flusso. I metodi e le funzioni richiedono tipi di parametri espliciti, che vengono utilizzati per inferire altri tipi. I tipi di parametro non possono essere dedotti dal metodo o dal corpo della funzione. A volte, tuttavia, i tipi di parametro sono noti dal contesto esterno e quindi non devono essere etichettati. Due esempi,
val f: String => Unit = hello("aaa", _)
val s = Seq(1,2).map(_+1) // Seq[Int].map expects a function of Int argument type
Qui di seguito è una citazione da Martin Odersky sulle limitazioni di inferenza dei tipi di Scala, rispetto, per esempio, ML e Haskell. Le sfide includono sovraccarico di Scala, selezione dei record, e sottotipi, come pure la necessità di mantenere le cose semplici,
Il motivo Scala non ha Hindley/Milner inferenza dei tipi è che è molto difficile da combinare con caratteristiche tali come sovraccarico (la variante ad-hoc , non classi di tipi), selezione record e sottotipizzazione. Non sto dicendo impossibile: esiste un numero di estensioni che incorpora queste funzioni; ; in effetti sono stato io stesso un po 'di loro . Sto solo dicendo che è molto difficile farlo funzionare bene nella pratica , dove è necessario avere espressioni di tipo piccolo e buoni messaggi di errore . Nemmeno uno dei casi è chiuso: molti ricercatori sono che lavorano sul superamento dei limiti (si veda ad esempio il numero MLF di Remy). Ma al momento è un compromesso di tipo migliore inferenza vs supporto migliore per queste funzionalità. Puoi fare il tradeoff entrambi i modi . Il fatto che volessimo integrare con Java ha scalzato le scale in favore di sottotipizzazione e lontano da Hindley/Milner.
Fonte: commento al post Universal Type Inference is a Bad Thing.
fonte
2011-08-19 18:16:13
ma nel mio codice, c'è solo un metodo 'ciao'. Vuoi dire, la classe può essere estesa, e la sottoclasse può sovrascrivere il metodo 'ciao' e rompere il codice? – Freewind
Devo ammettere, non sono sicuro se questo sia effettivamente possibile con la sottoclasse. Ma anche senza di esso, penso che sia un po 'più coerente richiedere sempre l'annotazione del tipo. Altrimenti tutto il codice senza un'annotazione di tipo che si interromperebbe improvvisamente, se si è scelto di aggiungere un sovraccarico. – Debilski
Sono curioso di sapere perché, in quel caso, 'm1' non è solo polimorfo sul tipo del suo argomento. –