Domanda

Ho comprato di recente La Programmazione Di Scala, e sono state la lettura attraverso di essa.La lingua sicuramente non è quello che mi aspettavo!In particolare, sembra di attuare ogni linguaggio di programmazione idea che mi sono informato, al di fuori della macro Lisp e Haskell tipo a livello di effetti collaterali di segregazione.

Francamente, mi ha un po ' sopraffatta.Anche se suppongo che è bello avere tanti strumenti a mia disposizione, mi è stato davvero solo in cerca di un tipizzata in linguaggio funzionale la JVM.Immagino che probabilmente potrebbe usare la Scala in quel modo, ma immagino che se mi interagire con tutte le librerie o passare attraverso di chiunque altro codice, potrai essere in esecuzione in un sacco di questa (per me) OOP roba--caratteristiche e "gerarchia di oggetti di linearizzazione," tutto questo astratto e l'override di business, singleton, pacchetto, e compagno di oggetti, le conversioni implicite...per non parlare delle varie sintattica collegamenti e zuccheri.

Le persone spesso si lamentano per i programmatori che cercare di calzascarpe di una lingua di stile in un altro, per un sacco di buoni motivi.Ma non tutte le lingue sono come paradigma multi-Scala, quindi, forse, la sua comunità ha una visione diversa?In F#, per esempio, sembra che ci sia qualche margine di manovra stili di programmazione e quanto OOP in uso.Ma solo dalla lettura io non sono sicuro se questa è una buona filosofia per la Scala.

Può più esperti Scala programmatori che mi aiuti qui? Edit per chiarezza: In sostanza, posso usare tranquillamente solo (o soprattutto) la FP caratteristiche di Scala senza preoccuparsi della sua avanzata OOP lato?

Mi dispiace per la vagante domanda!

È stato utile?

Soluzione

Io penso che ci sia sicuramente un punto fermo in questa domanda.È illuminato, guardando come una qualsiasi biblioteca è in grado di gestire eccezioni.

Se si interagisce con una libreria Java, qualsiasi metodo può lanciare un'eccezione.Questo potrebbe essere sia in modo esplicito, attraverso un controllato eccezione - o trasparente (da una prospettiva di API), tramite un runtime fa eccezione.Cosa devi fare, come un programmatore che potrebbe essere cercando di utilizzare il più funzionale Either tipo per indicare l'errore (o scalaz's Validation)?

Non è affatto chiaro per me come andrà a giocare fuori in scala (es.per affrontare il problema e la scelta puramente funzionale approccio).Certo è probabile che producono molti stili diversi di codifica.Detto questo, c'è molto ricco e utile la funzionalità di scala che si possono raccogliere;ed è certamente possibile avere questo mix funzionale e imperativo codice nel vostro programma di lavoro insieme.Anche se funzionale purista può, naturalmente, essere in disaccordo sul fatto che questo una situazione ottimale.

Per quel che vale, ho trovato che l'applicazione di paradigmi funzionali entro i miei programmi ha migliorato il mio codice senza fine.Come non ho provato sia Haskell o F# Non saprei dire se il risultato è migliore o peggiore.

Ma si asciuga il pavimento con Java;e per ottenere che la JVM (con il vantaggio pratico di coesistenza con tutte le nostre librerie Java) è una killer app, dal mio punto di vista.


Ai bordi, come si inizia a utilizzare la scala di vista funzionale di più, ci sono una serie di questioni, che si esegue in.Questi sono la maggior parte, ovviamente:

  • la mancanza della funzione implicita currying (cioèequivalenza di A => B => C e (A, B) => C)
  • la mancanza della funzione implicita tupling (cioèequivalenza tra un n-ary funzione 1-ary funzione che prende una n-tupla come parametro)
  • la mancanza di inferenza per la parte applicata di tipo costruttori (es.l'equivalenza di M[A] con, per esempio, Either[Int, A])

Entrambi questi problemi di quello che dovrebbe essere abbastanza chiaro e funzionale codice, brutto e oscuro.

Altri suggerimenti

Una delle cose che stai vedendo è che Scala è, prima di tutto, un linguaggio funzionale fortemente tipizzato sulla JVM

Scala non è solo un linguaggio funzionale. E ha cominciato fuori come una (Imbuto: http://lamp.epfl.ch/funnel/ ), ma questo è stato poi esteso per renderlo un linguaggio orientato agli oggetti, con l'obiettivo esplicito di rendere fortemente interoperabile con le classi Java.

astrazione e sovrascrivendo e pacchetti sono tutti esempi di questa interoperabilità in azione.


Il resto potrebbe essere considerato non come nuove funzionalità, ma semplicemente come eliminare le restrizioni da Java. Prendendo loro uno alla volta:

tratti e oggetto gerarchia linearizzazione

Rimuove la restrizione che le interfacce Java possono contenere solo metodi astratti. Linearizzazione è come Scala risolve i problemi di diamanti eredità che questo sarebbe altrimenti causare.

single

metodi statici Java sono una sbornia da esso di C ++ patrimonio sintassi, che a sua volta li ha aggiunto per supportare al meglio l'esigenza di stile procedurali per l'interoperabilità con i metodi C. statici sono molto non orientata agli oggetti (si veda questa domanda: Why sono oggetti Singleton più orientato agli oggetti? )

compagno di oggetti

Consenti singletons da utilizzare in sostituzione di metodi statici, con i loro diritti di accesso privilegiato.

conversioni implicite

Java già fa questo, ma è limitato a solo implicitamente conversione di oggetti e primitive in stringhe, come nel "" + 3 espressione. Scala solo estende questa idea e permette al programmatore di utilizzarlo per altre conversioni.

Lasciatemi aggiungere qualche commento alla risposta di Kevin.

Tratti vengono utilizzati principalmente come astrazioni (in senso lato, allo stesso modo che le classi di tipo Haskell definiscono astrazioni) e mixins. Quindi, il mio codice potrebbe utilizzare il tratto mappa, ma è molto usare un'istanza di tipo come HashMap. Al contrario, se voglio il mio tipo "servizio" per avere funzionalità di registrazione, potrei mescolare in un tratto registrazione riutilizzabile.

Per fortuna, raramente si deve pensare l'algoritmo di linearizzazione al di là dei casi più semplici, ad esempio, posso mescolare in un tratto che intercetta (impacchi) una chiamata di metodo per registrare il fatto che il metodo è stato invocato. Le esigenze algoritmo per gestire i casi più complicati di linearizzazione (come gli esempi mostriamo nel libro), ma in realtà tali tipi complessi sono una cattiva progettazione, IMHO.

Singletons, compresi gli speciali oggetti sottoinsieme da compagnia, sono progettati per rendere il tutto un oggetto, ma si potrebbe anche semplicemente vedere come namespace avvolgendo funzioni e possibilmente qualche stato.

Le conversioni implicite sono molto utili, se un po ' "magica". Si potrebbe trovare utile per vedere come essi sono utilizzati per simulare Haskell tipo-classi. Ecco una grande post di Debasish Ghosh: http: / /debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html

Anche se ho iniziato a programmare a Scala, io non sono sicuramente un membro più esperto della comunità Scala. Ma ho lavorato a lungo con un'altra lingua - python, che in misura minore ha una situazione simile. Supporta procedurale, orientato agli oggetti e stili funzionali. Ho trovato che mentre alcune persone tendono ad attaccarsi ad un estremo, molti combinano costrutti da stili diversi. Così pitone idiomatica consisterà di uso intensivo di comprehensions lista, prima classe, ordine superiore e funzioni parziali, anche se i dati di queste funzioni lavorano sono oggetti. Tuttavia è da notare che nel corso degli anni, la tendenza è stata quella di spostare leggermente verso funzionale.

Credo che dato l'inclusività di stili che supporti Scala è solo probabile che non ci sarà un modo giusto per risolvere un problema. Ma non sarei sorpreso di vedere che una quota maggiore di programmatori tendono lentamente verso uno stile che fa uso giudizioso di entrambi, anche se rimangono tolleranti di programmatori che desiderano bastone per uno degli estremi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top