Press "Enter" to skip to content

GOTO 2014 • Scala: The Simple Parts • Martin Odersky


va bene così
per l’invito ad aiutarmi a parlare
Qui
quello che ho intenzione di parlare
ovviamente e sto andando parlare di
Scilla le parti semplici e questo implica
che forse non tutte le parti sono semplici
come è stato applicato ma sottinteso da molti
altri prima di così SCADA è in realtà
festeggia il suo decimo anniversario così tempo
vola dieci anni fa c’era il primo
annuncio che non avremmo mai sognato
in realtà avere un linguaggio che ha così
molti sviluppatori che sono così popolari ora
non possono farlo così quando il
l’annuncio è venuto è abbiamo detto che noi
avere una nuova lingua che ha tre
innovazioni quindi quelle che abbiamo menzionato
erano tipi astratti e miscelazione
composizioni che uniscono idee da
sistemi oggetto e modulo che è
qualcosa che non ha avuto molta stampa
quindi i sistemi oggetto e modulo erano uno dei
i principali punti importanti al
all’inizio il secondo era il modello
corrispondenza tra le gerarchie di classi unificate
dati funzionali e orientati agli oggetti
accesso e semplifica notevolmente il
elaborazione di alberi XML quindi XML era molto
importante quando quando uscì Scala e
era molto importante per l’industria
un tempo in cui tutti
IBM molte altre società hanno annunciato il
linguaggio che avrebbe costruito in XML
supporto perché XML era così importante
bene ora ovviamente i tempi sono cambiati
e forse possiamo spiegare XML con JSON
e anche dieci anni possiamo sostituirlo
con qualcos’altro che immagino ma
al momento era molto, molto molto
importante e importante in particolare
è stato importante perché supportato
corrispondenza del modello in modo che la corrispondenza del modello sia
una tecnologia funzionale e XML era così
una sorta di vetrina perché sono pronto
poi il dogma orientato agli oggetti che era
molto forte tutti credevano in quel
era che per dire bene dovresti mettere il tuo
metodi in cui i tuoi dati sono e
incapsulamento di sospensione orientato agli oggetti
e se al momento se proponi
qualcos’altro eri completo
la gente eretica ha appena detto no no no
avere tutto sbagliato, quindi siamo i tempi
sono cambiati un bel po ‘ e il
le opinioni sono cambiate un po ‘ma a
il tempo è stato così e quando XML
è venuto fuori che era il bambino poster per il perché
programmazione funzionale mia
essere utile perché non si poteva mettere
metodi in un albero XML non lo era
il possibile XML era puramente dati ma tu ancora
ha dovuto analizzare e analizzarlo e che
lo schema di corrispondenza era molto buono per quello
ecco perché è una specie di gomito
l’all’inizio di Scala ha giocato
un grande ruolo ma ora si ferma il terzo
uno era una sintassi e un tipo flessibili
sistema consente la costruzione di
librerie avanzate e nuove
lingue specifiche del dominio in modo che ordinamento
di mostra questi il ​​tema che Scala è un
linguaggio che è germogliato parecchio
di lingue specifiche del dominio in alto
va bene così è stato l’annuncio e
dieci anni dopo la Scala è cresciuta abbastanza
un po ‘ adesso ne abbiamo circa un centinaio
mille sviluppatori difficilmente contare ma su
la figura del ballpark è più concreta
i numeri sono duecentomila
abbonati alla Coursera online
corsi complessivi 13 numero tredici in
le valutazioni del linguaggio dei monaci rossi che sono
basato sul numero di progetti github e
numero di domande di overflow dello stack e
oltre i numeri quello che penso sia di più
importante molti molti molti di successo
rollout e utenti felici quindi è così
bello vedere che così tante persone trovano
questo è un linguaggio che possono
esprimersi bene e questo
li rende felici di scrivere il codice ma su
l’altra mano ha anche discusso di Scala
forse più controverso può essere
previsto per il linguaggio della sua età e il
La domanda ovviamente è perché intendo Scala
è probabilmente grande sono molto grandi
rispetto a quello che ci si poteva aspettare dieci
anni fa ma rispetto a dire un vero
linguaggio controverso come C ++ o Java
è minuscolo quindi perché tutti parlano
su qualcosa che nel grande
lo schema delle cose è così insignificante
beh penso che ci siano entrambi interni
polemiche che non aiutano e poi
là i reclami esterni il
le controversie interne sono in realtà
abbiamo un bel po ‘di sub differenti
comunità in questo linguaggio di gara che
non sono d’accordo su ciò che programma in Scala
dovrebbe essere e abbastanza spesso sono davvero
non vedere il punto dell’altro
comunità le loro parti che non lo fanno
il punto di orientamento all’oggetto
e il loro programma orientato agli oggetti è chi
non vedere il punto della multa di questi
i modelli più avanzati di funzionalità
programmazione e le due comunità
a volte si scontrano e non si mescolano e poi
sono le lamentele esterne come quella
senti spesso è catalizzato in ambito accademico
quando ascolti spesso anche Skaar ho venduto
fuori dall’industria quindi cos’è?
i tipi di studiosi sono troppo difficili, ecco cosa
spesso senti solo un altro sottoinsieme
le comunità come tipi di studiosi non lo sono
abbastanza severi abbiamo bisogno di più tipi di cui abbiamo bisogno
tipi più forti e molte persone dicono
lucernari tutto e la cucina
affondare e quell’ultimo punto è quello che
mi fa arrabbiare di più perché quando io
creato SCADA che è precisamente il
opposto di ciò che volevo creare I
voleva creare qualcosa di semplice e
perché la lingua è una comunità
sforzo molte persone contribuiscono a questo
e anche per ragioni storiche il
la percezione di Scala forse è a volte
non è così quello che voglio fare in questo
parlare è tornare alle semplici parti di
Scala a ciò in cui credo il nucleo del mio
parla di questo diagramma che dice questo
cercare in Scala è un unificatore che unifica
orientato agli oggetti e funzionale
programmazione e con che hai a
allo stesso tempo unificazione di
essenzialmente linguaggi di scripting e
i linguaggi di sistema in modo che Scala possa essere utilizzato
come linguaggio di scripting ha persino vinto il
Script di script su JavaOne una o due volte
ed è anche naturalmente il substrato
di distribuzione molto grande milioni di
schieramenti di linee su Twitter per
istanza e molte altre aziende che
usarlo essenzialmente come la spina dorsale per
tutto il loro business quindi Scala in
quell’immagine doveva essere scalabile
lingua come il nome implica già e
se chiedi cosa è scalabile allora in effetti
si potrebbe dire che ha due significati
il primo significato è un significato diretto da dire
Scalable significa growable quindi Scala è un
lingua del coltivatore
è un linguaggio che può essere più modellato
in nuove lingue aggiungendo librerie
queste librerie diventano quindi
lingue specifiche del dominio che fanno parte
di Scala e se vuoi scoprire tutto
sulla crescita di un linguaggio quindi di gran lunga il
meglio parlare di questo è affari ragazzi 1998
oops nota fortunata chiamata crescita a
lingua se non hai visto il parlato
e con tutti i mezzi fare è un assoluto
pezzo di bellezza del secondo significato che
Ho anche intenzione di parlare di è un
linguaggio che consente una crescita così scalabile
nel senso di consentire la crescita che
significa che possono essere gli stessi costrutti
usato sia per piccoli che per grandi
sistemi e che permettono un liscio
crescita da piccola a grande
così il primo linguaggio disegnabile Scala
sicuramente ha un sacco di funzioni
Rendilo un linguaggio coltivabile ha a
sintassi molto flessibile come tipo flessibile
il sistema ha operatori definibili dall’utente come
funzioni di ordine superiore implicite e tutte
queste cose insieme lo rendono relativamente
facile creare nuovi domini specifici
lingue in cima allo skyline molte persone
l’ho fatto e dove questo ti ha deluso
ora hanno macro che sono ancora un
caratteristica sperimentale così rigorosamente
parlando non si dovrebbero usare macro per
uso della produzione ma che non ha mai avuto
di nuovo chiunque volesse davvero creare
il suo linguaggio e la sintassi così un sacco di
le persone hanno saltato sul loro carro della banda
e macro utilizzate per creare ancora di più
raffinato e avanzato dominio specifico
lingue in cima a Scala
così che ha davvero portato a molto
interessante e di successo
lingue specifiche del dominio che abbiamo
ecco quindi c’è lo scalpello per l’hardware
s ovviamente scintilla per i Big Data lì
spry per l’ invio HTTP sono informi
e le biblioteche Z scholar che essenzialmente
solleva Scala al livello del livello
di programmazione a livello di testo sono chiari
per il successo del database o squeryl come un
alternative loro specifiche e prove di Scala
per il test come akka per la spedizione di attori
un’altra libreria di invio HTTP e come SBT
che è essenzialmente uno strumento scalabile
che usa SCARA come lingua per
scrivere un conto
così definitivamente questa idea di globale ha
ha elaborato un sacco di dls in cima
Scala e questo è ovviamente solo un
esempio ce ne sono molti molti che io
non potrebbe adattarsi alla diapositiva qui, ma è
crescere ma bene va sempre bene
infatti credo che sia un doppio taglio
parola da un lato sicuramente lascia
ti dà la libertà di esprimere
te stesso per spostare la lingua in una nuova
campi e questo è grandioso, ma dall’altro
mano può anche fratturare l’utente
comunità c’è un saggio che io
personalmente trovato molto bene che sarà
sicuramente suonò un campanello con me che è
chiamato maledizione Lisp per dire bene perché se
Il Lisp è un altro linguaggio molto coltivabile
ma la maledizione della Beatitudine è essenzialmente quella
proprio questa proprietà porta a a
frazionamento della comunità di utenti
inoltre, ovviamente, non è specifico per il dominio
il linguaggio è apprezzato da tutti allo stesso modo
come nessun linguaggio generico è
gradito da tutti, così che di nuovo porta a
un tale partizionamento dell’utente
comunità che amano SPT coloro che
odio SBT coloro che amano accendere coloro che
preferisco Hadoop e così via così e l’altra
il problema è che spesso le lingue ospitanti ottengono
almeno parte delle colpe per la DSL
stare a letto
quindi, in breve, la crescita è ottima
sperimentazione per i più avventurosi
tra di noi, ma richiede disciplina
rimanere conformi ad alcuni standard quando si
voglio usarlo su larga scala
la produzione usa quindi il secondo significato
stato un po ‘trascurato da tutti
l’ attenzione sul primo su
le scale altro e grobel e possiamo
fare meglio mettere nuove cose in cima
SCADA ma penso che sia ancora di più
importante alla fine così che lo SCADA sia
davvero un linguaggio per la crescita che puoi
inizia con un one-liner che puoi
sperimenta rapidamente e poi puoi crescere
senza temere di cadere dalla scogliera
perché lo stesso linguaggio costruisce
ti ha aiutato a scrivere il tuo one-liner
si applicano ancora quando scrivi il tuo milione
sistema di linea è solo oggetti tutto il
discese e funzioni fino in fondo
non ci sono altre cose
devi imparare che poi calcia per
programmazione nella grande vendita è
lo stesso linguaggio lo costruisce davvero
scalare dagli script ai grandi sistemi
e le distribuzioni di scala in effetti ora entrano in gioco
i milioni di righe di codice e il
migliore caratterizzazione di cosa
significa un grande sistema come quello che ho
sentito è questo qui per dire un grande
il sistema è un modo che non conosci nemmeno
che alcuni dei suoi componenti esistono così
questa è la definizione di grande
sistema non lo sai nemmeno certo
le cose esistono in quel sistema dove tu
lavorare su una parte di questo e lo faremo
scoprire cosa significa questo per il software
costruzione quindi la lingua funziona
anzi per programmi molto grandi gli strumenti
sono sfidati più grandi sono le basi di codice
ad esempio, maggiore è la pressione
sui tempi di costruzione e stiamo lavorando molto
difficile da rendere gli strumenti recuperabili in
ultima versione di Scala per esempio noi
sono notevolmente migliorati incrementali
costruisci i tempi e spero che lo speriamo
aiuterà un sacco di persone là fuori che
che stanno lottando con il largo taglio di Scala
basi di codice quindi ciò che consente la crescita così
cos’è questa cosa che rende Guerra
consentire la crescita, quindi credo davvero
è questa quattro altra combinazione unica
di orientato agli oggetti e funzionale
perché i grandi sistemi che vediamo
lì fanno davvero affidamento su entrambi, così loro
generalmente si tende ad essere abbastanza
disciplinato e funzionale e questo è
bene, ma quando si mescola nel
componenti del corso che utilizzano tutte le
trucchi disponibili in object-oriented
sistema perché funzionale da solo non lo fa
ti do davvero la colla il the
composizione i meccanismi di raggruppamento per
grandi sistemi un problema con quello è
che non esiste un nome stabilito per
questo dovremmo chiamare questo oggetto linguaggio
funzionale alcune persone hanno proposto
ma non mi piacciono i termini con una barra
in loro mi ricorda troppo di pl / 1
quindi, quindi, cosa facciamo bene?
piacerebbe fare ma preferiremmo che fosse
come questo per avere funzionale e oggetto
programmazione in armonia seduti sul
spiaggia ma nella realtà attuale lo è
sfortunatamente più spesso mi piace
è così che vedono molte persone funzionali
orientato agli oggetti
il malvagio manager che si appoggia al tuo
cubicolo e dice bene che non hai
scritto il tuo UML il diagramma dell’occhio nel
modo giusto ed è così che molti oggetti
quando le persone cessano la programmazione funzionale
come lo scienziato pazzo che ha armato
qualcosa che non può portare a nulla di buono
e probabilmente minaccerà il mondo e
è sfortunatamente dove trovo Scala
spesso per essere così tra le due sedie
cadere tra le sedie e ottenere
la loro colpa da entrambe le parti
un’altra citazione che è piuttosto divertente è
Citazione di James Irish che gli studiosi hanno scritto in
un ruolo nella storia come James
scritto questo breve incompleto e per lo più
la storia sbagliata di linguaggi di programmazione
è divertente se non l’hai visto
eppure così ecco cosa scrive su
Skyride dice che l’ultima volta è stata libera per me
Conosco una scrivania Martina ubriaca che vede a
Coppa di burro di arachidi di Reese ai piedi –
con il burro di arachidi di qualcuno
salire sulla cioccolata di qualcun altro e
ha un’idea che crea il linguaggio collare
che unifica i costrutti da entrambi
orientato agli oggetti nei linguaggi funzionali
questo business di entrambi i gruppi e ciascuno
prontamente dichiarato jihad
quindi è incredibilmente preveggente che non l’ho fatto
quando sono uscito , ok, molti sono venuti fuori
in realtà non pensavo che fosse
un po ‘divertente ma ora non lo sono
certo che prima dovrei farlo
in realtà vero e secondo, dovrei esserlo
non sono sicuro che sia più divertente
ma va bene così tanto per un funzionale
orientato agli oggetti si vede che è un duro
è una zona difficile da affrontare, quindi io
vorrei proporre è in realtà a
sposta leggermente il punto di vista o se no
il punto di vista e almeno il nome noi
dare a questa cosa un altro modo per
vedere Scala è intrinsecamente modulare
lingua quindi cosa significa questo
Scala è ancora una fusione di
orientato agli oggetti e funzionale ma esso
lo ottiene per passare da piccoli script
ai grandi sistemi perché è molto
modulare quindi cosa fa la programmazione modulare
significa programmazione perfettamente modulare
significa semplicemente che i sistemi dovrebbero essere
composto da moduli okay e quali sono
i moduli dovrebbero essere ben moduli
parti semplici che possono essere combinate in
molti modi flessibili per dare interessanti
risultati semplici parti che possono essere
combinati in molti modi e semplici spesso
mezzi e capsula otto
funzionalità solo una ma si potrebbe dire
beh questa è la vecchia programmazione modulare dei cappelli
questo è un fenomeno degli anni ’80 che abbiamo avuto
lingue come modulari per loro e
anzi tempo ho un ho un certo
passione per i due modulari perché lo era
la prima lingua che ho programmato
sul serio e penso davvero modulare 2
è stato fantastico per il suo tempo, ma questi non lo sono
i primi anni Ottanta sono cambiati in
in particolare all’inizio degli anni ’80
lingue che e la maggior parte dei computer erano
fenomenale angwa jizan per norman
computer in modo che significa essenzialmente
un computer era una memoria in un processore
e un bus di una sola parola e il
le lingue riflettevano che così avevano
variabili di un tipo semplice o un puntatore
entrambi facciamo oggi in una parola e
sei il buco ogni parametro API o
la funzione era larga solo una parola così
manipolare il sistema che si doveva fare
parola per parola e al momento c’era
già John Backus l’inventore del
primo linguaggio di un alto livello per l’unzione
quello era Fortran quando ha ottenuto il Turing
premio negli anni ’70 ha dato un premio itinerante
conferenza che ha detto che ha coniato questo
termine il collo di bottiglia di von Neumann perché
dice che i linguaggi devono evolversi
oltre a ciò perché devono parlare
su cose di livello superiore non solo
singole parole che hanno da parlare
grafici e polinomi e testi e
cose del genere e per fare ciò che ti serve
una teoria matematica di queste cose
e se guardi alla matematica e a quelli
le teorie sono sempre immutabili
non modificare mai qualcosa in atto in
matematica e per questo hai bisogno
programmazione funzionale in modo che fosse ordinata
della sveglia per funzionale
programmazione negli anni ’70 va bene così se tu
credo che poi sicuramente funzionale
la programmazione è una parte di modulare
programmazione e in effetti se si guarda
il secondo fondamentale più importante
carta per la programmazione delle funzioni quindi io
direi che è questo qui
perché la programmazione funzionale è importante per John
usare il 1985 e il suo caso è chiaramente un caso
di modularità, quindi quello che dice John
sta bene in un programma imperativo tu
avere un algoritmo nell’algoritmo lui
guardato era proprio come Newton-Raphson
l’iterazione per la radice quadrata potrebbe avere
stato qualsiasi algoritmo hai un algoritmo
e ha un ciclo e ha un
passo di iterazione in c’è un termine
la condizione lì dentro è stata straziata insieme
cosa poteva fare con funzionale
programmazione è che potrebbe dividerli
elementi in diversi moduli
funzioni che potrebbero essere combinate all’interno
un approccio mix-and-match quindi si è diviso
questi a parte in funzioni separate e
potrebbe combinare argomenti chiari a
modularità vuol dire così
la programmazione funzionale è davvero la
uguale alla programmazione modulare che ha
come ho detto, aiuta molto ma non lo è
anche non è esattamente
la stessa cosa
alcuni concetti sono in lingue di funzione
in disaccordo con modularità così per
istanza a volte lingue funzionali
o alcune lingue funzionali assumono in
alcune aree un namespace globale è un esempio
sono classi di tipi in Haskell puoi solo
avere un’istanza per una classe nel tuo
intero programma e se ricordi il
definizione di ciò che un grande sistema sei tu
non so nemmeno i componenti certi
esiste che è un problema perché non lo fai
sapere se i componenti che tu
non so esiste potrebbe avere un
implementazione della tua classe di tipo
sarà in conflitto con il tuo e ci sono
altre cose alcuni linguaggi funzionali
hanno sistemi di moduli molto potenti per
istanza SML o Okemo altro mezzo modulo
sistemi che sono piuttosto deboli per
esempio un Haskell o una chiusura
prendiamo quei due e poi puoi
discuti anche se la digitazione dinamica è
in realtà qualcosa che è in contrasto con
modularità perché ti dà un punto debole
modo per controllare le tue interfacce o meno ma
questa è una discussione completamente diversa
e preferirei allontanarmi da quello
quindi oggetti e moduli quali sono i loro
relazione quindi in un certo senso si potrebbe dire
lingue orientate agli oggetti siamo una specie di
i successori dei linguaggi modulari
perché c’era questa idea di dire bene
invece di avere singoli moduli, facciamo
essere più flessibile
abbiamo classi che possono creare questi
cose in fase di esecuzione dove possiamo avere un
numero arbitrario di istanze che abbiamo
tratti o interfacce che sono
sono le API di quelli che possiamo
avere un singolo modulo di una singola classe
più interfacce e il singolo
l’interfaccia può essere implementata da più parti
le classi quindi era in un certo senso più
modo flessibile per essere modulare ma sul
l’altra mano orientata agli oggetti non lo fa
sempre implica modulare per così tanto
Ad esempio vediamo che vediamo le cose al
meno vecchia aderenza di scimmia rubino
lo sterzo comunità di rubino da
questo è molto buono perché
il patch per le scimmie naturalmente non è modulare
ha lo stesso problema che puoi
è possibile applicare lo stesso nome una sola volta in
il tuo intero programma e se qualcun altro
prova provare a fare ciò che hai molto
bug strani e molto difficili da rintracciare
problemi che abbiamo linee su stato mutabile
non modulare perché ti dà molto
di nascosto ha facilitato il pentimento e poi a
molto orientato agli oggetti tradizionali
le lingue hanno una composizione piuttosto debole
e le strutture di decomposizione così
gli effetti di ciò è che ne hanno quindi bisogno
fare affidamento sull’iniezione di dipendenza esterna
quadri in modo che sia qualcosa che in
Principali moduli nella tua lingua
dovrebbe fare ma se la lingua non può fare
hai bisogno di qualcos’altro che usi
programmazione orientata all’aspetto o bytecode
riscrittura e la decomposizione
le strutture spesso incoraggiano questa idea
che dovresti mettere i tuoi metodi dove
le tue lezioni sono quelle che a volte sono le
approccio giusto ma non sempre così voglio
tornare a SCARA ed è semplice
parti se ora guardiamo che cosa è semplice
le parti sono moduli e parti così loro
dovrebbe essere semplice e dovrebbero essere
combinati in modi flessibili prima di guardare
ai moduli come Scala può scrivere moduli
come componenti di una libreria guardiamo
il linguaggio stesso quali sono i semplici
parti in Scala che possono essere mescolate e
abbinato in modo flessibile a quello che sto per fare
fare è ho intenzione di proporre sette semplici
blocchi elementari che ho preso un po ‘e
una panoramica di come i programmi e il
classi che ho scritto lì in passato
anni e dice quali sono le cose che
non posso fare a meno di ciò su cui realmente conto
perché ovviamente quando scrivo codice in
Scala lo trovo piuttosto semplice
diresti bene, certo che lo fa, ma io
penso ancora che voglio darti un po ‘
il mio punto di vista perché lo trovo semplice e
quello che uso qualsiasi cosa io pensi che
la cosa è combinata bene come sempre
Ovviamente il semplice non è lo stesso di facile
quindi citando ricco Hickey qui alcune persone
confondere per ancora confondere i due facili
significa che è qualcosa che è carina
vicino a quello che già sai che è
familiare e quindi puoi rapidamente
adottarlo semplice significa qualcos’altro
mezzi semplici fa una cosa sola e può
essere combinato bene e i due sono
a volte lo stesso ma non necessariamente
così e molte persone ne confondono uno per
l’altro quindi diamo un’occhiata al semplice
parti e le parti semplici sono in realtà
piuttosto noioso, ma sono comunque
importante quindi ho pensato che fosse importante
che li ho sottolineati così per me il primo
cosa che è importante sono le espressioni
e il fatto che tutto sia un
espressione quindi significa che posso collegarmi
tutto in tutto il resto perché a
l’espressione, naturalmente, può essere una funzione
chiamata o operazione e ci vuole
espressioni come operandi e perché
tutto è un’espressione che significa
con cui posso comporre tutto
tutto il resto se avessi un linguaggio così
aveva dichiarazioni ed espressioni come molte
le lingue tradizionali non potrei fare
che vorrei vivere in un mondo o nel mondo
altro e quando vivo nella dichiarazione
mondo devo scrivere queste dichiarazioni
uno in uno dopo l’ altro e io
devono in qualche modo collegarli con
variabili mutabili in modo che loro tipo di
agire su queste variabili è molto di più
modo indiretto e meno componibile per
trattare le cose quindi ecco solo alcune semplici
codice che mostra come funziona così l’if
altrimenti ha la stessa sintassi di Java ma
è un’espressione che questa cosa darà
tu una stringa adulto o minore e il
la stessa cosa accade per le espressioni di corrispondenza
quali sono gli interruttori analogici in C o
Java e prova e tutte le altre forme
di dichiarazioni che di solito vedresti
le nostre espressioni e questo significa che possono
essere messo l’uno dentro l’altro e può essere
nidificato bene così che era il numero uno
il numero due per me sarebbe questo
principio degli scopi di nidificazione così
tutto in Scala può essere annidato
tutto il resto e c’è una statica
disciplina di scoping e questo è ancora molto
importante per essere in grado di refactoring
programmi liberamente così in Scala puoi farlo
scrivere un metodo all’interno di un metodo in Java
non puoi farlo non puoi scrivere
metodi dentro i metodi ma puoi scrivere
una classe dentro un metodo e poi a
metodo all’interno della classe interna, quindi se
c’è una sola classe tra allora
stai bene
quindi vorrei scrivere una lezione qui sto bene
ma non posso incasinare direttamente perché non c’è
leggere nessuna buona ragione perché è solo il
è giusto ma è grande
impedimento per strutturare effettivamente il tuo
i programmi si sentono così al posto dei due
termini e tipi di spazi dei nomi e
hanno esattamente la stessa regola per ciascuno
uno mentre in altre lingue come
di nuovo citando Java ne hai quattro
classi di metodi dei campi dei domini
pacchetti e tu hai diversi
regole di risoluzione per ciascuno solo per
dì quella sorta di differenza tra
semplice e facile credo che questo colore il
Le regole Java sono per qualcuno che viene
da Java facile perché è quello che
sei abituato a non vedere il
la complessità in tutto questo ma è lontana da
essendo semplice è piuttosto complesso per
namespace regole diverse per l’ età va bene
quindi, a cosa serve questo principio
in realtà un principio piuttosto potente per
semplifica i tuoi programmi quindi il primo consiglio
Dò a tutti quelli che dicono bene come posso
andare sulla strada giusta e scrivere pulito
Il codice Scala è che non dovresti imballare troppo
molto in un’espressione è un novellino
errore per le persone nuove
programmazione funzionale perché può
imballare le cose in un’espressione spesso
le persone lo fanno e questo è in realtà il codice che ho visto
nel nostro codice base è un singolo
l’espressione ha una quantità incredibile
di funzionalità ma non significa
che si deve fare in questo modo così solo
per il gusto di farlo ho detto bene facciamolo
facciamo solo un refactoring per vedere cosa
otteniamo così ecco la stessa espressione ma
ora ho appena scomposto tutti i
risultati intermedi significativi quindi è così
C vedi che in realtà produciamo un set di
fonti e quindi abbiamo uno spazio di lavoro
root e quindi hai una funzione che
dice straniero dato
voce che è un insieme di file che diamo
voi i file che corrispondono al
entrata e poi cosa facciamo alla fine noi
itera su tutte le fonti e per
ognuno di loro ha la possibilità di ottenere i file
quello corrisponde alla voce e noi
concatenarli tutti insieme se tu
non conosco il vocabolario, naturalmente
questo potrebbe sembrare ancora complicato per te
ma chiunque abbia una specie di a
conoscenza superficiale di SCADA per loro
sicuramente questo sarebbe molto di più
leggibile rispetto alla cosa che ti ho mostrato
prima e la cosa importante è quella
sì, posso farlo, posso scrivere valvole così
solo definizioni locali ma posso anche
scrivere funzioni che vengono chiamate tutte solo
su richiesta e posso metterli proprio dove
le mie espressioni di risultato sono che non devo
inquinare la mia classe che racchiude in modo che rende
è molto facile e davvero un gioco da ragazzi per
fai precisamente questa cosa se la tua lingua
non ti ho lasciato fare e avresti avuto un
scelta di dire che devo creare un nuovo
metodo nella mia classe per valutare questa cosa
fuori ma poi devo passare molto
parametri ad esso e devo scrivere a
documento e tutto il mio sarà molto
molto più grande di un trade-off e
sarai un po ‘più spinto verso
scrivere metodi molto lunghi che hanno un
avere un super loop o una lunga espressione
o cose del genere, quindi era il numero
due nidi penso sia molto importante
il numero tre è modelli e caso
classi o decomposizione e composizione
quindi ecco un esempio classico di questo
se vuoi avere un albero delle tasse a tre
che rappresenta espressioni aritmetiche
e avresti un tratto base chiamato
espressione e poi ne avresti due
classi una per i numeri e una per i più
il posix estende il tratto base e loro
avere i parametri che ti aspetti così
il numero ottiene un int e più ne ottiene due
espressioni che sono i due operandi di
il più e poi da qualche altra parte
in un modulo diverso in un altro
tempo puoi scrivere un metodo di valutazione
se vuoi e il metodo di valutazione
direi semplicemente diamo un’occhiata
a quello che abbiamo qui se è un numero
restituiamo la M se è un vantaggio allora
valutiamo ricorsivamente i due sub
espressioni e sommarle così è
semplice e flessibile funzionale
gli appassionati di programmazione provenienti da ml
o Haskell probabilmente direbbe che lo è anche
verboso può essere fatto più concisamente in
Haskell o ml e questo è vero perché
haskó e ernõ hanno tipi speciali per
queste cose hanno chiamato
I tipi di dati algebrici che abbiamo scelto di non
fallo perché volevamo rimanere
semplice e uniforme tutto in Scala
è una classe non c’è un insieme separato di
tipi che esprimono queste cose e
secondo perché non penso in realtà
il codice è importante così tanto se tu
confronta la dimensione del tuo tipo
definizioni con le dimensioni di tutto
tu fai con loro, poi ci crederei
ogni programma i tipi sono davvero a
piccola minoranza in modo da ottimizzare i tipi
non è non è non vale la pena così tanto se
tu guardi il tradizionale
alternativa orientato agli oggetti per ciò che
sarebbe ovviamente questo qui così qui
ora diciamo bene perché non abbiamo
genitorialità è in realtà molto imbarazzante
capire che classe avremmo
usare una bella istanza di o come istanza
fuori per un modello di visitatore o cose simili
che tutto è piuttosto goffo e
pesi massimi cosa si farebbe in genere
è dire che mettiamo eval in the
espressione banale stessa e poi nel nostro
numero di classe e nella mia classe di classe I
avere le giuste implementazioni di IVA
e va bene se è quello che è tuo
dominio dell’applicazione significa che se
hai una serie di tipi nella sezione principale
modella e sai già esattamente cosa
vuoi farlo con quello che ho io
espressioni per valutarle e forse
li stampo graziosamente ma sono sicuro che lì
non sarà nient’altro d’altro canto
hai spesso situazioni in cui i dati
il modello è dato forse da un database
schema o un formato di interscambio o
qualcosa di simile
e tu non sai cosa vuoi fare
con esso e potrebbe cambiare l’anno prossimo
e poi l’approccio orientato agli oggetti
qui è in realtà quello sbagliato perché
dovresti in qualche modo toccare tutti questi
cose tutto il tempo per cambiare il tuo
logica aziendale dove ciò che realmente
dovrebbe fare è avere un Pure Data
modello che è fisso, stabile e messo
la logica di business altrove in
programmazione funzionale e modello
abbinandoti hai la scelta che puoi fare
l’una o l’altra ovviamente è la scelta
sempre un po ‘
che è anche una responsabilità per te
devi fare la scelta ma penso
in questo caso è in realtà molto molto
importante molto bene perché non c’è
il miglior valore predefinito dipende molto dal tuo
applicazione
quindi il numero quattro per me sarebbe la ricorsione
questo è, naturalmente, sappiamo tutti cosa
le funzioni ricorsive sono una sorta di
ovunque ma in programmi imperativi
sono persone piuttosto sottoutilizzate che usano
preferisce piuttosto loop e usa variabili
per quello e nei linguaggi funzionali
ciò che la gente di solito fa all’inizio è
sostituisci un loop con un Combinator simile
mappa e mappa piatta e filtro e cose
così e che è grande questo è
esattamente l’approccio giusto che tu
dovrebbe fare ma d’ altra parte
c’è sempre un momento in cui il tuo
La libreria Combinator non ha ciò che tu
devi fare quindi è necessario un fallback si
bisogno di un ripiego per dire bene cosa succede se il mio
Il combinatore non mi dà davvero il
giusto vocabolario e poi il ripiego
nella programmazione funzionale penso sia
davvero bello avere questa idea di
in particolare la ricorsione dice ricorsiva
funzioni che con ciò possono simulare con
un modo molto sistematico qualsiasi macchina a stati
puoi vomitare con te può venire su
con e che lo fanno in particolare molto
in modo efficiente quindi è l’altra cosa
che a volte sei preoccupato di tutto
i tuoi operatori di livello superiore potrebbero
in realtà ti costa troppo in generale
sono abbastanza veloci ma potrebbe
sii che hai di fronte essenzialmente un
hot spot dove dici bene devo
spremere ogni ultimo ciclo fuori di esso e
allora è fantastico che tu possa
specializzarsi a mano e con ricorsività
funzioni e particolarmente ricorsive
funzioni sono una specie di naturale
evoluzione di ciò che useresti un look
per in lingue imperative così ora quello
L’ho detto e ovviamente il
il numero cinque che userete sicuramente
molto nella programmazione funzionale è
i valori delle funzioni in modo che uno sia bello
ormai incontrovertibile potresti dire
quasi tutte le lingue là fuori hanno
qualche forma di valori di funzione a volte
ottengono l’ambito governa un po ‘
sbagliato in questo modo il significato di questa
e chiusure di JavaScript è un po ‘
funky ma in generale è il
cosa giusta e va benissimo
il numero sei per me sarebbe una collezione
quindi le collezioni sicuramente sono le
spina dorsale della programmazione in funzionale
lingue abbiamo collezioni immutabili
come i nostri valori predefiniti o persistenti
collezioni che è il tuo programma
quindi un trasformatore dalle collezioni a
collezione così prende le collezioni
produce nuove collezioni e non è un
programma di crudità creare un aggiornamento di lettura cancellare
programma che colpisce nelle collezioni
elemento per elemento e SCADA ha un molto
bella biblioteca di collezioni immutabili
che risulta essere molto molto semplice
uso ed è semplice da usare in particolare
perché ha un singolo vocabolario di
operazioni potenti come la mappa o
filtro e si applicano a qualsiasi raccolta
che potresti pensarci là fuori
comprese le raccolte che scrivi
te stesso quindi ecco un piccolo esempio in
azione quindi abbiamo un gruppo di persone e
serie di persone e mappiamo la funzione
che prende il nome della persona sopra
la schiera di persone così è così
essenzialmente uno screenshot di un foglio di lavoro
Fogli di Kalibak o scrivi nuovo tipo
espressioni a sinistra e arrivi qui
i tipi e le risposte che la scala
involucro getterebbe indietro a voi in modo da questo
cosa è integrata nell’IDE di Eclipse
e IntelliJ ha una cosa molto simile quindi
risponderebbe per dire bene che torno indietro
con un array di stringhe che ottieni
indietro una stringa di matrice ed è barb e
Karla potresti fare la stessa cosa con
imposta così abbiamo un set di uno quattro cinque
sette e potresti mapparlo dicendo
bene applicare una divisione per due a ciascuno
operando quindi questa è la mappa canonica di
beni e otterresti un set di zero
a tre notare che la dimensione del set
è diverso e questo è corretto perché
gli insiemi non sono sequenze se si mappa come me
avere una mappa sul set ed è qualcosa
diverso da una mappa su una sequenza
cosa importante è il concetto di mappa è
esattamente lo stesso è un matematico
concetto qui e qui abbiamo un terzo
uno una mappa in realtà di numeri romani così
esso mappa i caratteri a
numeri corrispondenti e quale mappa
qui ritorna che inverte
questa mappa qui così scambia essenzialmente
le coppie chiave e valore così qui che hai
una chiave
Elland valore D e si restituisce un valore D
e la chiave L e ciò che è importante qui è
in ogni caso il risultato è esattamente
lo stesso tipo di quello che hai iniziato
nessun attrito quindi se lavoro in set
Voglio che la mia mappa si applichi agli insiemi
voglio convertire in sequenze
iterare e quindi riconvertire ciò che farebbe
essere essenzialmente tre operazioni invece
di uno così davvero la massima semplicità
che potrebbe avere qui, quindi sono una specie di
rendendo il caso per questa forma di
collezioni perché è stato effettivamente
criticato molto in passato, quindi voglio
per dare una sorta di contro-argomento
perché continuo a pensare che sia la strada giusta per
utilizzare raccolte come questa così il
le contro-argomentazioni sono essenzialmente due
ma ne sto presentando solo uno qui
contro-argomento che a volte senti
è come dire che il tipo di mappa è così
bene complicato diamo un’occhiata al tipo
di mappa ecco quello che vedi in questo
Caradog
è una funzione dalla quale prende una funzione
A to B, quindi questo è il discorso di Scala
Araya
per il tipo di array di ae ti dà
indietro un array di B è quello che vorresti
aspettati bene, il problema qui è
che c’è una cosa che dice usare
caso e quella è una specie di bandiera rossa che
per dire bene che in realtà non è il reale
digita il tipo che vedi come utente
di array che in realtà dovrebbero essere il
scrivi solo quello che conta per te perché
c’è un utente di sorgere che vuoi vedere
quel tipo quindi qual è il vero tight well
apriamo questa cosa sul caso d’uso
e qui vedi la firma completa di
mappa ed è piuttosto intimidatorio per te
avere un secondo parametro di tipo che e
hai un parametro implicito di tipo
può costruire da esso dice bene se inizi
con un array di T e tu hai un tipo B
allora puoi tu ed ee tu hai un
ricetta per costruire da una matrice di T e
ci sarà un tipo di quello che poi è un
risultato quindi è qualcosa che è molto
molto astratto e indiretto ma il
motivo per cui abbiamo questo tipo è che noi
voglio avere solo un singolo
implementazione o stampa in linea di principio a
singola implementazione della mappa in
raccolte di raccolte intere prima di noi
per iniziare
tipo non abbiamo fatto quello che avevamo 20
diverse implementazioni di map one per
array e quelli per liste e cose
così e il problema con quello era
che spesso queste implementazioni loro
alcuni di essi divergenti erano altri bacati
non erano
alcuni di loro alcuni a volte le persone lo farebbero
implementare un nuovo metodo su un certo
raccolta telefonica quindi mancava
dagli altri a volte lo stesso
era presente la funzionalità
diverse collezioni sotto differenti
nomi perché sono stati trovati diversi sviluppatori
che nessuno fa la stessa cosa così noi
essenzialmente abbiamo detto che ora basta con tutto ciò
ciò di cui abbiamo bisogno è un quadro molto rigido
che ha una singola implementazione della mappa
per il tutto e poi lo farebbe
funziona automaticamente per tutto il
collezioni e in realtà essere in grado di
fai in modo che tu abbia bisogno di qualcosa di così flessibile
come quello che vedrai in un secondo così
la contro-argomentazione sarebbe bene perché
non abbiamo definito la mappa come la mappa globale
questo così abbiamo detto queste collezioni loro
sono funtori quindi i funtori sono essenzialmente
cose che hanno una mappa e se guardi
il tipo che ci si aspetterebbe
qui e un functor è il tipo di mappa
sarebbe molto simile al primo
digita quello che hai visto così ci vuole il nuovo
digita il vecchio elemento IP e il nuovo
elemento di tipo U e ti dà una F di
U dove F è essenzialmente tuo
costruttore il tuo tipo che tu
parametrizzare su questo è il fattore I
il problema è che quella mappa
non funziona per una gara in quanto per costruire un
nuovo array su JVM hai bisogno di un corso
impilare e non c’è modo di contrabbandare
un tag di classe nella firma è solo
non possibile
funziona su tutti i tipi, non solo sui tipi
che ha tag di classe quindi non funzionerà
in questo modo funzionerebbe per i set no I’m
ho paura che non funzioni anche per le serie
perché per costruire un nuovo set hai bisogno di a
modo di confrontare gli elementi di quel set
per evitare duplicati e di nuovo non c’è
modo in cui puoi effettivamente contrabbandare in un
funzione di confronto degli elementi in questo
mappa in modo che la ragione per cui può costruire da è
è essenzialmente un modo generalizzato di
esprimere tutte queste raccolte specifiche
vincoli dici che avresti un
l’istanza di può costruire la forma per dirlo
sarebbe se stesso chiedesse bene per gli insiemi se tu
dammi l’ uguaglianza che posso costruire
impostare la matrice può costruire da direbbe
se mi dai un tag di classe che posso costruire
sei un array e questo è essenzialmente il
una specie di colla generica che trovi
nelle librerie di raccolta come utente
non lo vedi mai così, in realtà
abbastanza miracoloso che tutto questo
macchine intelligenti che costruiscono il giusto
raccolta per te al momento del runtime
non trapelano nelle firme
è per questo che mi piace molto
tipo costruito dal numero sette e ultimo
sarebbero variabili cerchi
Sono variabili vuote funzionali qui loro
sono e non sono variabili modulari vuote
beh se speri con se tu esageri
loro e li abusano sì globale mutabile
lo stato spesso porta a dipendenze nascoste
tra oggetti e questo è molto pessimo
dall’altra parte penso che parte del
appello e la trazione che ha SCADA
per me è che è un modo piuttosto carino
combinare lo stato mutabile con le funzioni
e se lo fai in modo intelligente e saggio
puoi ottenere grandi benefici da questo
Ho guardato dove nel mio ultimo progetto
dove ho effettivamente usato lo stato così mio
l’ultimo progetto è stato un nuovo compilatore per
Scala chiamato punto C e questo è il compilatore
in linea di principio è un programma funzionale
è molto vicino a un completo funzionale
l’architettura e la preoccupazione per
farlo è da un lato è bello
è molto pulito, ovviamente la preoccupazione è
non sarà lento e l’idea di
questo compilatore è che è un compilatore
dovrebbe essere molto più veloce dell’attuale
Scala C quindi un compilatore lento non è quello
volevamo ma d’altra parte c’è
una bella cosa da dire bene se il tuo programma
è puramente funzionale allora in realtà
ti dà un sacco di nuova ottimizzazione di
possibilità ok
opportunità che non avresti
altrimenti il ​​primo si memorizza nella cache
tu dici bene se hai una funzione è
una pura funzione che ti darà
lo stesso risultato ogni volta che si applica
agli stessi argomenti bene se il
la funzione è costosa, significa che tu
può in realtà memorizzare nella cache che è possibile memorizzare
la funzione così la prima volta che
applicato la funzione ho messo gli argomenti
e il risultato in una mappa e il secondo
volta ho bisogno della funzione di nuovo alzo lo sguardo
la mappa per fare quello che potrebbe essere un grande
accelerazione a seconda di quanto veloce o lento
la tua funzione è
ma il caching è un’arte da solo così tu
non riesco a immaginare che non puoi supporre che il tuo
la lingua farà tutto per te perché
darà solo un singolo
versione della cache e che spesso non lo è
abbastanza buono quindi quello che ho effettivamente trovato
il compilatore è che le vocali pigre
che la lingua ci dà ma poi
sono le funzioni memorizzate e
a volte li metti in una mappa normale
a volte in una mappa debole a seconda di
le politiche di conservazione ci sono stagisti
nomi in modo che un po ‘come la primavera
stagista ma per le nostre strutture e
Loro anche nascondono LRU perché qui noi
voleva limitare la dimensione di una cache a
impedirlo anche da da
crescendo troppo grande così tutte queste cose
sono usi di stato piuttosto sofisticati
che alla fine potrebbe rimanere completamente
nascosto il fatto che tu incassi il tuo
programma in modo aggressivo non cambia il
semantica del tuo programma a tutti è
ancora un programma puramente funzionale anche
sebbene usi molto stato nel
cache internamente e possiamo verificarlo
perché possiamo effettivamente trasformarli
cose su e fuori dalla configurazione e
dopo quello che possiamo in realtà
verificare che il programma sia eseguito esattamente come
altrettanto bene sarà lo stesso risultato
molto più lentamente se giriamo il
memorizza il secondo utilizzo che ho
trovato era persistente così che l’idea è
che se hai un valore in una mappa a
qualche punto spesso il valore si stabilizza così
il valore della mappa non cambierà nessuno
più se quel valore per quella chiave sarà
rimanere sempre lo stesso nel resto del
programma e poi ci si potrebbe ottenere un
miglioramento dell’efficienza se si rimuove il
valore dalla mappa e metterlo in
oggetto proprio lì perché l’accesso è
più veloce e non hai il problema
di perdita di memoria che hai in una mappa
quindi quello era il numero due
di nuovo è inosservabile se si sceglie
il tuo tempo in cui vuoi persistere
correttamente
il terzo era copy-on-write quindi loro e
questi il compilatore ha alberi non tipizzati così
questo è essenzialmente il compito di a
type checker è il accetta un albero di sintassi
e non ha tipi e questo
produce un albero di sintassi e ce l’ha
tipi e nell’attuale Scala C
compilatore essenzialmente lo abbiamo fatto
mutazione così questi alberi di sintassi che hanno
uno slot per i tipi e poi ce ne sono alcuni
sorta di attraversamento che
mette il tipo nello slot e quello
tipi di versamento all’inizio è ovviamente
qualcosa di imperativo è una specie di
in modo tradizionale è stato fatto in
compilatori finora ma non è il puro
modo funzionale perché non puoi
metti tipi in questi slot così che tu
voglio fare è, naturalmente, lo vuoi
trasforma questi alberi immutabili a digitare
alberi e ce ne sarebbero due diversi
i dati strutturano il problema con quello
di nuovo è la prestazione perché questi alberi
sono molto grandi questi alberi profondi sono
in genere i più grandi dati di dati
costruisce qui in un compilatore così a
copiali tutti solo per aggiungere un campo tipo
è inefficiente e lì osservi
bene se inizi con un tipo di alberi e
c’è questo tipo di campo seduto lì
allora la prima volta che vuoi
dare un tipo all’albero che potresti
riutilizzare bene l’albero con cui hai iniziato e
ovviamente la seconda volta che vedi questo
albero in un contesto e pezzi diversi
ora proprio ora che su type tree c’è a
tipo diverso non si dovrebbe ignorare
il tuo tipo sarebbe un osservabile
effetto collaterale quindi a quel punto quello che facciamo
è copiare e scrivere tu dici una copia su
secondo scrivere c’è un tipo diverso
che vuoi associarlo al
stesso albero immutabile a quel punto ma
solo a quel punto che ha copiato il
di nuovo albero è piuttosto sofisticato
uso dello stato imperativo che non lo è
osservabile e finalmente sono freschi
valuta così nomi freschi e ID univoci e
se quello è anche qualcosa che tu
è abbastanza carina per te
fare clic su generare nomi nuovi e quello
significa che hai solo un contatore globale
che tu sia aggiornato e che tu sia quello
ti dà un numero che aggiungi al tuo
nome e idee uniche funzioneranno allo stesso modo
modo
e se l’hai fatto, se l’hai fatto
tutto ciò allora in realtà si scopre che
ci rimangono esattamente due variabili
le due variabili ti danno la corrente
vincolo per il controllo del tipo
quindi essenzialmente, ma i miei limiti sono per
tipo di inferenza e corrente
Diagnostica quindi il registro degli errori quando I
scrivere errori e si scopre che questo
stato deve essere la versione così non c’è
essenzialmente un albero del possibile
esplorazioni in cui è possibile tornare indietro e
cose del genere, quindi deve essere molto
controllato rigorosamente okay ora puoi
dite bene che tutti questi sono usi interessanti
di stato che potresti nascondere ma il
ultimo non si poteva che è veramente sorta
l’essenza della
stato essenziale in un controllo di tipo così
Non si dovrebbe utilizzare una monade per che così
è una specie di classico funzionale
approccio al giorno d’oggi se hai soggiornato
incapsulato in un momento bene se tu
dai un’occhiata a quello, allora è quello che noi
dovrebbe fare così è quello che facciamo
ora sono due delle operazioni principali
che trattiamo come questo tipo di operazione
che accetta un albero di tipo suora e un
tipo previsto e ti dà un albero di tipo
e c’è un’operazione a cui è sottotipo
scegli un altro esempio che richiede due
tipi e dice che ti restituisce a
il tempo booleano di un tipo è un sottotipo di
l’ altro ma ho solo scelto in questa mente
la vera base di codice quella sorta di due
operazioni fondamentali che ho
qui così nell’approccio monadico perché
entrambe queste cose possono produrre nuove
i vincoli e il tipo possono produrre nuovi
errori dovrei metterli nel
tipo di stato monade
quindi questo significa che con un risultato ora è un
tipo di stato di qualsiasi altra cosa
ritorno prima e sotto le coperture a
tipo di stato è in linea di principio il
risultati che tu ritorni e il nuovo
stato costituito da queste due variabili
ma tu lo nascondi in questo nello stato tu
nascondere lo stato e monitorare qualsiasi
l’istruzione monarca va bene così se lo fai
che poi ecco il tipico caso d’uso
usa l’esempio di utilizzo, quindi cosa faresti
in questo momento primo narak nell’attico pre-nato
codice qualcosa come quello in cui dici
bene vediamo se c’è un tipo t1
è un sottotipo del tipo t2 e questo è a
digitare t2 è un sottotipo del tipo t3 e
se sì, restituire un risultato con
le monadi ovviamente non puoi farlo
perché il risultato di ogni sottotipo
non sarebbe più un booleano
essere un tipo di stato di booleano quindi cosa
si dovrebbe fare è devi avere
per tirare fuori il tipo di stato che avresti
estrarre o nel booleano dal
tipo di stato e affrontarlo
in seguito
e Scala è un sintattico molto conveniente
zucchero per quello per queste cose monadiche
che è una for-expression in cui è mappata
operazione mappa e mappa e tu puoi
usalo per qualsiasi monade che abbia
mappa e mappa piatta
quale è quali sono le monadi così come sarebbe
sembra così
ma la domanda che dovresti chiedere
auto bene come è questo meglio è
sicuramente più a lungo potresti dire che è così
di più in
narrativo perché io vedo qualcosa di simile
odora di dichiarazioni qui proprio così
cose che operazioni che tornano
risultati quindi in un certo senso sono tornato a
programmazione imperativa solo su un monadico
livello e in terzo luogo ancora non fa o
nella cornice ingenua ancora non fare
quello che voglio perché sicuramente qui se
il primo è il sottotipo è falso che voglio
restituire immediatamente falso non al
la seconda e penso di poter fare un rig
su la monade con la pigrizia che è così
vero qui ma non è la cosa che
lo faresti immediatamente e immediatamente
sarebbe molto semplice o efficiente
a farlo per me la cosa importante di
programmazione funzione non è tanto che
nascondiamo le cose a Moniz ma il
la cosa importante era questa che avremmo usato
lo stato a VAR eravamo molto molto
economico con gli Orsi con noi prima
introducendo uno che pensi davvero tanto
a questo proposito ti serve per questo che ti
è necessario che come si fa la versione
la parte importante il tempo allora
dopo si dice bene, ho messo questa cosa
dietro essenzialmente un tipo di muro come a
la monade è secondaria e ci sono una specie di
considerazioni pratiche se
a volte è una buona idea ea volte
non è così non è così penso in realtà
questa domanda di digitare e monitorare a
parte di questo è molto una domanda
di compromessi quindi credo che tutti questi siano
belle lingue e nessuno di loro ha ragione
nel loro approccio necessariamente così tu
potrei scegliere di dire bene che non lo so davvero
voglio parlare di tipi nel mio
lingua è staticamente in fase di compilazione volta che ho
non chiamare il compilatore è
essenzialmente è un correttore di sintassi che
verifica che la mia sintassi abbia senso o io
potrei dire bene ho parlato di tipi in
i tradizionali argomenti di senso e
risultati di funzioni e ho un molto
sistema di tipo flessibile in modo molto preciso
digita i sistemi che lasciano che mi faccia esprimere
quello o io potrei andare oltre e dire bene
Voglio anche parlare di effetti collaterali
come dichiarare quali sono le modifiche di stato
ho quello che devo più efficace
avere e poi quando lo fai e tu
ho il linguaggio B Haskell o potrei
andare in una direzione diversa e ho detto
anche io voglio parlare di
proprietà dei valori
come se questo valore sia uguale a
quel valore o questo valore è dentro ed è
dato intervallo e quindi si ottiene a
linguaggio con digitazione dipendente come
Idris o potresti andare fino in fondo e
Diciamo che voglio parlare di totale
correttezza così con il mio programma che voglio
avere una prova di correttezza del mio programma
e poi hai qualcosa come un
interattività o migliorare mi piace il cazzo o
Isabel e tutti questi sono validi
approcci e nessuno di loro ha ragione
nessuno di loro è migliore dell’altro
ed è sempre un argomento pratico
fino a che cosa
in che misura i tuoi tipi ti aiutano
più di quello che ti ostacolano includendo
introduzione di ulteriori dati tecnici e
ulteriori restrizioni nel modo
puoi cucinare e sicuramente la maggior parte
i programmi non vengono scritti rapidamente
Cocke come sono scritte in chiusura così
c’è anche un argomento di velocità in a
argomento di produttività e Scala cosa
il sistema di tipo scarlatto è davvero molto
essenzialmente è fermamente qui, così lo Scara
i tipi sono piuttosto raffinati ma si affineranno
l’ idea di avere tipi raffinati non lo è
così tanto da poter esprimere molto
proprietà con loro almeno non giuste
ora penso che si potrebbe andare lì in
futuro quindi ma è piuttosto dire dove
abbiamo un’alternativa molto flessibile per
lingue che non usano tipi che sono
digitato dinamicamente quindi vogliamo dirlo
ovunque vogliamo vogliamo avere un
linguaggio in cui i tipi sono flessibili
abbastanza e abbastanza espressiva in modo che
non sono un grosso peso per le persone che
potrebbe altrimenti aver scelto dinamicamente
linguaggio tipizzato è per questo che il tipo
il sistema in Scala è piuttosto raffinato e
l’idea che possiamo effettivamente spostarlo
ce n’è uno interessante ma io
no
enfatizzalo adesso, quindi lo penso
nel corso dei prossimi cinque anni o giù di lì lì
saranno eccitanti nuovi sviluppi in
effetti al to per esprimere effetti
ci sono effetti jabrai è molto
argomenti di ricerca attivi ce ne sono diversi
altre ricerche sugli effetti e credo
probabilmente tra cinque anni arriverà al
conclusione che nessuna monade non è la
modo giusto per parlare di effetti così
è anche per questo sarei molto esitante
usare le Monade per gli effetti in questo momento buono
quindi passo subito alle forme di riposo
dei moduli quindi ne abbiamo visti sette semplici
parti di Scala
e come possono queste parti poi tenervi
combinato per scrivere moduli nell’utente
codice infatti credo che i moduli se
parliamo di moduli che prendono un grande
numero di moduli, quindi sono molto aperto a
diversi modi per scrivere un modulo modulo
potrebbe essere una funzione potrebbe essere un oggetto
potrebbe essere una classe che significa un modello
in cui puoi avere molti oggetti
potrebbe essere un attore potrebbe essere una stringa
trasformare potrebbe essere un micro servizio così
dipende da cosa vuoi finchè a
il modulo è qualcosa che è semplice e
dove l’ID focus sta nel modo in cui mod
il modulo può essere combinato con altri
per me è un modulo quindi è un modulo
qualcosa che esiste principalmente per essere
combinato con altre cose e meno dentro
isolamento per quello che può fare così SCADA è
un linguaggio abbastanza modulare è modulare
anche le radici sono modulari. L’ ho detto
già è la prima lingua che ho programmato
in modo intenso e il primo che ho scritto a
compilatore per molto tempo fa modulare 3
era anche una lingua molto interessante
introdotto haspell sottotipizzazione universale
da haskell scala ha scelto questa idea di
classi di tipi che li hanno resi di più
modulare trapiantandoli in
parametri impliciti e credo che il
più grande influenza e l’iniziale
annuncio sulla prima diapositiva davvero
ha sottolineato che erano moduli SML quindi Scala
eredita davvero molte idee da SML
moduli piuttosto diretti
corrispondenza per dire cosa chiama SML a
struttura chiamiamo un oggetto è un functor
una classe con parametri a firma è a
i tipi astratti di tratti sono uguali e
ciò che le chiamate SML condividono siamo noi stessi
chiamare un raffinamento così le caratteristiche che
scarra ha per la programmazione modulare i
credo che il nostro primo sia un tipo piuttosto ricco
sistema che ci dà il vocabolario
parla delle cose che vanno e vengono
di moduli quindi credo che la digitazione statica
è uno strumento molto importante da verificare
incapsulamento quindi hai il
essenzialmente astrazioni core per
moduli oggetti quindi è essenzialmente un
modulo atomico una classe che può essere
parametrizzato ed esiste in molti
istanze e a scrivere quello è
ti dà una fetta di modulo di un modulo
API e che possono essere essenzialmente combinati
con mescolare la composizione con altri
fette in modo che le classi siano parametrizzate
i commerci stanno tagliando e poi ci sono
tipi astratti e tipi astratti sono a
modo molto potente per farlo
cose astratte per renderle di più
generico più generale quindi un buon esempio
qui c’è una biblioteca di grafici dove si trova
davvero incredibilmente difficile da fare per te
conoscere in un modo veramente generico, quindi ecco
qualcosa che abbiamo avuto recentemente nel
Comunicazioni ACM in un documento in cui noi
ha avuto la nostra stessa pugnalata a produrre un grafico
libreria in modo ciò che avremmo fatto qui è di
dite bene che c’è un grafico commerciale che
Dice bene, sto parlando di grafici ora
e parlare di erba significa che devo
avere un tipo di nodi e un tipo di bordi
ma non so cosa siano lì
potrebbe essere qualsiasi cosa ai nodi e ai bordi I
so solo che ho una operazione di stampa
valutatore che ti dà un vantaggio
indietro un nodo e il successore è lo stesso
cosa e poi ho un grafico che è
di nuovo un tipo sconosciuto potrebbe avere qualsiasi
implementazione ma so che ha questi
metodi in modo che questo grafico sia in alto
legato di grafico quindi so per un grafico I
puoi scoprire quali sono i set di nodi
quali sono i set di spigoli per un dato
nodo quali sono il set di outgoing e
bordi in entrata e infine l’insieme di
fonti l’insieme di fonti di un grafico così
questo è essenzialmente il mio modo di stabilire il mio
vocabolario per dire bene questo è quello che siamo
andando a parlare di tanto in tanto, se ci
voglio scrivere un semplice modello di grafico allora
questo è quello che potremmo fare ora potremmo dire
bene ereditare i grafici retti e
slot nel tipo di grafici quindi qui con
il tipo di grafico era qualcosa che io
non ti ho detto che ti ho appena detto che lo farà
supporta questi metodi, quindi quello che diciamo
ecco ora abbiamo una lezione concreta e
ha alcuni nodi e ha alcuni bordi
che passo come parametri e qui sono
ovvio sono molto inefficienti
implementazioni dei tre rimanenti
metodi quindi c’è un principio potente
qui al lavoro e quando quando
iniziare con questo ho molti hanno molti
cose che sono astratte
Edge è precedente come successore nel grafico
in ogni momento posso dire bene ora e ora
certe cose e definisco quelle e io
non so ancora altre cose io
li avevo appena lasciati astratti basta definire
quello che sai lascia astratto ciò che tu
non è un principio molto potente
che in Scala funziona universalmente
tutto valuta i metodi e i tipi così
in questo modello astratto non l’ ho ancora fatto
ti ho detto che nota e quali sono i
bordi ma non ne ho bisogno funziona
esattamente allo stesso modo quindi se voglio
darti i tipi concreti di nodi e
bordi e questo è quello che potrei fare potrei
darti un modello concreto si estende di nuovo
grafici e qui e ora dicono bene un nodo
diciamo che è un grafico sociale è a
la persona e un vantaggio sono un paio di persone
e qui ci sono le implementazioni di
successore e predecessore quindi è giusto
una particolare esemplificazione di quello
che posso mescolare liberamente con il mio abstract
modello grafico e che mi dà il
completa implementazione quindi cosa c’è
interessante qui è lo stesso
il principio può essere usato per l’incapsulamento
così discutibilmente è un caso di
incapsulamento c’è un nodo di tipo ma io
non dirti di cosa si tratta e
parametrizzazione così qui ti ho dato
il tipo nel modello concreto così è
cosa farei di solito sotto il nome
di parametro quindi è molto potente
principio che puoi mescolare questi due così
parlando di generici di parametrizzazione
naturalmente è una graffetta delle lingue digitate
ora tutti ce l’hanno e quindi è insensibile
o parametrizza i tipi è molto
importante c’è questo punto di appiccicoso
varianza che probabilmente se tu hai
scritto Scala sai di cosa si tratta
dipende da come se un insieme di un elenco
le mele sono anche una lista di frutta o meno se
Apple è un frutto ed è un elenco di
mele di una lista di frutta così in SCARA
simile al c-sharp lo esprimiamo di
annotando il punto di dichiarazione con a
più qui per covariante mentre altri
lingue come Java ti costringeranno a farlo
fallo al punto d’uso e quello
in genere ottiene una più complicata
un po ‘interessante qui è in realtà quello
la parametrizzazione delle due cose astratta
i tipi possono essere combinati o più precisamente
i parametri possono essere mappati
tipi astratti e un altro interessante
un po ‘è quello che in realtà spiega cosa
questa cosa della varianza riguarda solo così
mostrare ciò che è parametri possono essere
mappato in membri astratti se
sono tipi o valori non importa
e gli argomenti quindi sono raffinati così
diamo un’occhiata a come funziona così
qui abbiamo il nostro set di lezioni e lo farei
dillo bene invece di parametrizzarlo
lasciatemi solo dare un campo tipo qui
quindi è che ha un tipo e ho modo la
nome leggermente perché non voglio
essenzialmente produrre il nome del produttore
conflitto se ci sono diverse classi
parametrizzato con T quindi quindi un insieme di
string sarebbe un set dove ora definisco
di che tipo è T è uguale a stringa
questo dimostra che questa cosa qui può
essere trattato come zucchero sintattico per quello
cosa qui la mia lingua diventa più semplice allora
per le liste vorrei fare la stessa cosa ma
perché elenca una covariante una lista di
il numero in realtà è una lista in cui il mio tipo
T è un numero o un sottotipo di ciò
perché sono anche liste di numeri interi
possibile come liste di numeri e quello
significa che il mio tipo di elemento è in realtà solo un
sottotipo di numero quindi mi dà un
un modo piuttosto carino per esprimere molto
caratteristiche diverse e mapparlo in a
nucleo comune ok e numero sette e
l’ultimo sarebbe parametri impliciti così
parametri impliciti siamo una specie di
inizialmente pensato per essere un uomo povero
classi di tipo che è stato il mio primo
caratterizzazione per loro per dire bene
Haskell ha classi e classi di tipi e
istanze e abbiamo tutte queste cose
in linguaggi orientati agli oggetti così tutti noi
è necessario ottenere funzionalità di classe tipo
parametri impliciti così effettivamente possono
modello che ecco si avrebbe un
operazione minima che funziona per tutti
cose che sono ordinate in modo da averne bisogno
per dare un ordine e che è implicita
quindi il compilatore lo farà per te e
puoi quindi esprimere un minimo un minimo
operazione su quel set ma loro
in realtà può esprimere molto più di
basta digitare le classi così ad esempio loro
può esprimere un contesto così è un contesto
qualcosa che essenzialmente tutti
dovrebbe arrivare a vedere e qualche volta
cambiamenti ma la maggior parte del tempo è ancora
tu
lo mantieni lo stesso così ad un certo punto
il contesto cambia ma il più delle volte
è lo stesso ed è di nuovo molto
uso utile di parametri impliciti che
a proposito, è così che faccio oggi
Iniezione di dipendenza, penso che sia così
questo è il modo ideale per farlo in questo modo
e infine può esprimere una capacità
dove dici per esempio se ne ho bisogno
accedere a un ID cliente, quindi ho bisogno di alcuni
diritti di amministratore quindi ho bisogno di chiedere che come
un parametro e di nuovo ha senso
rendere questo parametro implicito perché se
Ho i diritti di amministratore e ne hai bisogno
e chiamo le tue operazioni allora è così
tutto ciò di cui abbiamo bisogno per sapere il modo preciso in
che ho passato questo parametro per te
noioso e rumoroso se l’importante
cosa è l’ho ne avete bisogno e che
significa che possiamo passare la capacità insieme
e va bene va bene così riassumere
parti semplici tutto è un’espressione
tutto può essere nidificato e comporre
abbinare con la funzione parametrica di recurse
valuta le collezioni e i VAR immutabili
per me è così che sono le sette cose
che possiamo tenere nella nostra testa quello
rappresentano il nucleo di ciò che vedo è
Guara e nei moduli ne abbiamo due
cose di cui ho parlato così l’altra
parti poi c’è in realtà molto più di
Scala di quello e molto viene scritto
a proposito delle molte più parti che ci sono
cose come le conversioni implicite
tipi esistenziali tipi strutturali Hayek
Anna digita le macro e tutte queste cose
per me sono lontani dall’essere il
semplice core non sono il nucleo semplice
e infatti se guardi da vicino allora
non sono nemmeno nella lingua principale
perché per abilitare qualsiasi di queste cose
hai bisogno di una bandiera per la lingua così tu
devo dire ad esempio la lingua di importazione
dot x esistenziale prima di poter essere utilizzato
questi tipi esistenziali e il mio consiglio
Sarebbe bene non solo evitarli
a meno che tu non abbia un a meno che tu non abbia un
chiaro caso d’uso spesso il caso d’uso sei tu
voglio usare cicatrice come DSL per altri
lingua e va bene, ma se vuoi
per dire bene qual è il nucleo di
programmazione funzionale in Scala cos’è a
nucleo della programmazione modulare in Scala
allora non è necessariamente ok, grazie
tu

Please follow and like us: