Press "Enter" to skip to content

GOTO 2012 • Hard Things Made Easy: Monads • Sadek Drobi


stiamo parlando di Monent che già
conosce le monadi
Speravo che tutti li conoscessero così
sì non era il caso quindi cos’è questo questo
è una maniglia a destra una maniglia per questo
foto perché è interessante perché
in realtà una volta che lo guardi sai
come usarlo correttamente questo è fondamentalmente un
interfaccia un’interfaccia che quello che tutti noi
capire e tutti sappiamo come usare
e una volta che lo vediamo da qualche parte, lo sappiamo
come usarlo in realtà usiamo su
finestre su porte su frigoriferi su
altre cose e ancora una volta che lo vediamo noi
siamo operativi sappiamo come usarlo
è un’interfaccia conosciuta che ha una maglietta
semantica sappiamo come usarlo senza
importa ciò che i meccanici sono dietro
giusto se il blocco è sofisticato se
è un lato sinistro o destro se è un
finestra è un frigorifero tutto questo
le cose che non ci interessano è una
interfaccia che ha chiaramente definito
semantica ti basta oscillare questo ti giri
questa maniglia e puoi aprire qualcosa
è interessante, quindi lo siamo
parlando di un’interfaccia condivisa
la semantica è familiare è pronta per
usa e il tuo diritto operativo è giusto
un’interfaccia ora che cos’è una monade e
uno è esattamente la stessa cosa è un
interfaccia okay che definisce alcuni condivisi
la semantica va bene così che se tutti
capire questa semantica va bene allora noi
sarà in grado di usarlo indipendentemente da cosa
i meccanici sono dietro al
implementazione e ha un
implementazione quindi chiunque ne parli
tu Mona sono modelli o quelli di Mona
qualunque altra cosa sbagliano sono le monadi
interfacce ok, è un’interfaccia con
un’implementazione nello stesso senso in cui
usiamo anche le interfacce in Java così semplicemente
è un’interfaccia particolare che ha
qualche semantica va bene, quindi facciamolo
immagina di avere un contenitore solo a
contenitore di qualcosa proprio un contenitore
di un A
essere la classe delle cose giuste è così
un contenitore di forse intz okay o a
contenitore di stringhe è un contenitore
va bene che potrebbe contenere qualcosa di
digitare a ora potrebbe essere una lista di A
almeno è un contenitore che potrebbe
essere una lista di intz list of string a
per lo meno il contenitore va bene che noi
sapere di destra quindi siamo ancora semplici qui
potrebbe essere un’opzione di questo
un altro tipo di contenitore va bene, questo è un
prima finestra è la porta per la prima
esempio e un’opzione di un significato come
è un’opzione è un tipo che ha due
sottoclassi essendo qualcuno o nessuno e questo
usato per rappresentare qualcosa di simile
null abbiamo ciò che abbiamo nel codice Java
c’erano valori nulli ma in modo più modulare
e in modo più composibile a noi non importa
su questa roba quindi un’opzione di a è a
è un altro tipo di contenitore che potrebbe
essere un’opzione F non è un’opzione di stringa
o qualsiasi altra cosa potrebbe essere un albero di a
ancora un altro contenitore va bene siamo
parlando di contenitori di tipo a
futuro di un c’è un valore che succede
in futuro ho questo contenitore
mi consentirà di abbonarmi a
notifica quando la cosa entra in gioco
è ancora un contenitore d’ok noi
capisco come c’è un contenitore noi
ho solo un contenitore ok ora se ho
una funzione va bene una cosa di trasformazione
che sa come trasformare un A in a
B quindi se a è int e io ho a
trasformazione di un trasformatore o a
funzione che può trasformare un int in
una stringa va bene, è semplice, giusto io
sapere come uscire da una stringa
insieme al contenitore potrebbe essere
interessante davvero un bello da questo
contenitore per implementare qualcosa che
può darmi un contenitore di va bene è
molto semplice se ho una lista di A va bene
se ho una lista di int per esempio e
Ho questa funzione che può prendere un i
e restituire una stringa Wow ottenuto ottenere una R
e allora sarà bello da questo
contenitore per implementare un modo un meccanismo
in modo che possano trasformarlo in a
contenitore di stringa destra e da
in pratica quello che accadrà è andiamo
e a tutti gli elementi nell’elenco e
trasformando tutto su tutti usando
questa funzione è molto semplice
contenitore un elenco di int I e ho ottenuto a
funzione che va da ins a stringa
e mi piacerebbe avere un contenitore di
stringa No e non voglio a cura di
la struttura della lista cosa c’è dentro
l’elenco come è implementato come fare
essi passano attraverso la lista tutti questi
cose a cui non importa è solo un
interfaccia voglio usarlo e lo so
come usarlo perché ho ottenuto questo
interfaccia se ce l’ho ovviamente ora se
Ho avuto un’opzione di int lo stesso
funzione di trasformazione desidero
avere un’opzione di stringa stessa cosa è
un contenitore di qualche tipo va bene è un
funzione che trasforma questo tipo
dentro e ottengo il contenitore del
altro tipo giusto
semantica molto molto semplice qui stessa
la cosa per un futuro di non è che ottengo il
stessa funzione di trasformazione e voglio
per ottenere questa cosa così vediamo come un gatto
una sorta di interfaccia proprio dove noi
non voglio preoccuparti dei dettagli di
in che modo queste cose sono implementate, semplicemente
volevo averlo lì e sappiamo come
per usarlo non ci interessa il
meccanici come lo facciamo lo implementano noi
non mi interessa davvero è il
container guy che implementerà questo
interfaccia per me e voglio dire che so una volta
Lo vedo so come usarlo esattamente
come la maniglia ora questo è un funtore
ora abbiamo appena descritto cosa è il functor a
functor è solo questa interfaccia dove tu
puoi avere un contenitore di qualcosa
e tu hai una trasformazione per a
funzione di trasformazione e puoi leggere
puoi restituire un contenitore del
altra volta è tutto ciò che sa il funtore
beh, questo non è monent, ma lo siamo
quasi lì quindi mi piacerebbe
implementare l’interfaccia functor ora noi
parlato di codice giusto quindi è questo
esattamente lo stesso di quello che vedi qui
niente di più complicato stiamo dicendo a
functor è un tratto di interfaccia è un
l’interfaccia nello scanner è come un
interfaccia ne può avere un po ‘
implementazione ma questo non ci interessa
circa qui e ha questo contenitore
okay un contenitore generico non ci interessa
su cosa c’è dentro è come potrebbe
essere un M di ed e M di
non ci interessa è solo il contenitore
e questa è la funzione della mappa va bene lo faremo
prendi un contenitore di ae una funzione
che trasforma a a b e dà a
contenitore di B va bene, questo è esattamente ciò che
questo si descrivono solo qui a destra
l’ abbiamo appena scritto in encode adesso
vorrebbe implementare questa interfaccia
okay per una lista, per esempio, bene
molto semplice direi okay almeno
functor estende il funtore delle liste a
meno è stato verificato nel contenitore e
ora devo implementarlo avendo un
elenco di un A a B e quindi elenco per essere
giusto e devo passare attraverso la lista
qualunque cosa sia dentro la marca
endemico qualsiasi nella meccanica del
all’interno della lista per trasformare tutto il
elementi che usano questa funzione proprio ora
abbiamo implementato un functor che possiamo
implementare questa funzione per l’ opzione per
futuro per qualcos’altro
ora ovviamente sto giocando un’API
designer come sviluppatore non nemmeno
cura di queste cose e di come sono
sono definiti , basta sceglierli
solo un’interfaccia è mappa e uno no
importa dove vedo una mappa, lo so esattamente
come posso usarlo questo è un functor oh
questo è il funzionario, lo so che è assicurato
semantica comprendiamo le stesse cose
ora è così che stavo dicendo così
solo non voglio ragionare sul
container in termini di ciò che è al suo interno
e non in termini di cosa non lo sono
voglio preoccuparmi se è un’opzione o Xenon
Non voglio testare questi casi qui
una funzione dammi solo un contenitore di
il trasformatore questa trasformazione ora
abbiamo avuto fino a quando non abbiamo incontrato un problema ora
ovviamente ogni volta che stavamo lavorando
queste cose poi vorrei davvero
Ti do una funzione di trasformazione
quello non restituisce un B ma lo stesso
contenitore di B per esempio io raccolgo a
lista di a ti do una lista di fini e
Ti do una funzione che prende un int
e fornisce una lista di qualcosa una lista di
stringhe ora siamo bloccati perché
questo usando il funtore che produrrà
esattamente questo a Louie
produrrà un elenco di elenco di cose
proprio la stessa firma che stiamo usando
stesso funtore e otteniamo questo e questo è
non è molto bello , non è molto bello perché
è complicato al tipo
elenco di elenchi di
cosa vuol dire affatto intendo la lista di
liste di ins non è la lista di int così se
si raccoglie un’opzione di opzione di int
il che significa che forse ho un int
beh significa che forse ho un int giusto
opzionalmente opzione ho un int e I
può tipo di appiattire queste cose va bene
e questo è molto interessante immagino
ho un’opzione di qualcosa e ho un
operazione che in realtà ne restituisce un’altra
opzione in modo da utilizzare il functor Sono bloccato I
so che ho bisogno di qualcosa di più potente
può anche appiattire queste cose bene così dentro
nel caso della lista si ottiene meno
lista di elenchi di uno stesso quattro
le opzioni ottengono un’opzione di treno o a
perché ho avuto l’opzione FAA per opzione
di B mi dà l’opzione di opzione di B
sta usando la firma precedente
non stiamo cambiando nulla qui, giusto
ora che bello sarebbe se qualcuno potesse farlo
implementare per me qualcosa che anche
si appiattisce quando ho bisogno, non solo usa
la trasformazione ma quando ho questo
firma dove I da un contenitore due
di B appiattisce il contenitore del contenitore
di B la lista di lista di a perché il
l’elenco di una lista di a è una lista di un diritto
è una lista di liste di fini, quindi posso
basta appiattire questa lista e io ne ho una
elenco di tutti i contenuti in ins di tutto il
in questo modo queste liste sono proprio così
semplice okay e questo è un momento ora tu
sapere esattamente che cosa è il Mon se noi
guarda l’ interfaccia l’implementazione
e questo è esattamente il codice che eravamo
mostrando esattamente non abbiamo aggiunto nulla
qui diciamo come una monade è un’interfaccia
che prende qualsiasi contenitore okay che tu
può definire la monade per qualsiasi contenitore
e ricevo queste due operazioni una volta
dal functor va bene così una monade è a
functor ora sai questo puoi dire o
puoi twittare su di esso come un altro
è un funtore oh quanto è bello e così
hai la funzione mappa ma hai
anche la mappa piatta che è di più
interessante in alcuni casi in cui è necessario
per appiattire le cose così ottengo la mappa piatta e
Ho preso un contenitore di a e a
funzione che prende una A e dà un a
contenitore di B e ottengo un contenitore di
B invece di alimentare il contenitore di
contenitore
diritto che è molto semplice, si può anche
implementalo tu stesso ora che quel codice
è il progettista di un implementatore di a
monad non è lo sviluppatore che deve
vedi questo codice giusto è qualcuno che è
progettando una truffa che implementa a
monade per il suo particolare contenitore a destra
e questo è interessante perché da a
lo sviluppatore parte su tutto ciò di cui ho bisogno
so che questa è una monade che posso usare
mappa o mappa piatta e posso continuare a utilizzare
questa cosa per sempre senza alcun problema
destra ho potuto trasformare completamente
le cose compongono le cose e completamente
come usare questo senza alcunché
fermandomi quasi perché immagina questo
gestire se si prende questo handle come un
esempio e se ad esempio che a
la fabbricazione di questa maniglia lo dirà
come bene puoi solo girarlo tre
volte e dopo le tre alla terza volta
devi girare il contrario
o non funzionerà o non dovrebbe girare
tre volte o qualsiasi cosa, quindi ci sono
cose che non sono catturate nel
struttura giusta la struttura non lo è
raccontando qualsiasi cosa sul manico
ci sono alcune leggi a cui devi obbedire
essere in grado di usare per avere un buon
implementazione di una maniglia destra se
qualche produttore ti dà una maniglia
che ha alcune caratteristiche strane voi
perso la maglia della semantica condivisa
la semantica è molto importante e tu
Non avete voglia di perderla ed è per questo
C’è ci sono alcune cose che si
puoi catturare puoi implementare in
struttura nella tua implementazione e
ci sono alcune cose che devi verificare
essere in grado di essere sicuro che tutto
funzionerà bene quindi alcune proprietà
non sono garantiti con la struttura
e devi convalidare alcune leggi che
identità sono lasciati identità destra e
associarlo a leggi davvero molto semplici
come se si applica con l’idea con
una funzione che prende lo stesso e
restituisce le stesse le svolte al nostro
l’argomento a lo restituisce allora sarà
lo stesso Monat e cose così
molto piccole leggi che non vengono acquisite in
la struttura se come implementatore di a
monadi come qualcuno che ha un contenitore
e vuole implementare una monade tu
soddisfare queste leggi si garantisce che
avrai un buon funzionamento
Mona funzionante che non si spezzerà mai
mentre l’utente lo sta usando, lo sai
immagina che stai incatenando e qualcuno che
ottieni uno stato strano dove dice
si no non posso farlo più qualcosa
si ottiene con jQuery per esempio
a volte quando usi per iniziare a leggere
usando la cosa immediatamente ti dice
oh non è più un array e tu
devi rewrap in un dollaro in modo che
torna al jQuery e a tutti
queste cose che non vuoi avere
questo tipo di cose strane ti stanno succedendo
non piacerà che la cosa continui
funzionamento è per questo che obbedisci a questi
leggi e questo è tutto bene
teoria di categoria quale categoria teoria è
tutto quello che c’è lì solo per dimostrarlo
tu che questa cosa è gentile
caldo che la fondazione che dimostra che
questa cosa continuerà a funzionare
se obbedisci alle leggi e questo è tutto e
non devi preoccuparti di questi
cose a cui tieni a loro, se lo sei
interessato alla prova perché questa cosa
è funzionale e perché è interessante
come sviluppatore vedi una mappa che vedi a
mappa piatta sai che è una monade che conosci
come affrontarlo battere qualunque cosa
contenitore è potrebbe essere l’opzione potrebbe
essere futuro potrebbe essere albero potrebbe essere
IO potrebbe essere qualsiasi cosa
hai appena assicurato la semantica e
Interfaccia e si sa esattamente come
gestiscilo come un implementatore che abbiamo
un po ‘ di lavoro da fare è solo per
implementare questa interfaccia che abbiamo visto
molto molto semplice e puoi implementare
per la tua meccanica personale
contenitore e obbedire obbedire a queste tre leggi
e in realtà è così aperto
domande quindi cosa non mi piacerà se tu
ora immagino che molte persone sappiano cosa
le monadi sono immagino che sia abbastanza semplice
proprio come sentiamo un sacco di definizioni
Cerco di complicarli ma solo ora
quando vedi la mappa o la mappa piatta sai
esattamente come affrontare queste cose
Giusto, di cui hai parlato molto
mettere le cose nel contenitore sì
tirarli fuori dal contenitore
si, beh, quello non è parte del
Monat quindi alcuni contenitori quindi l’alcuni
i contenitori possono permetterti di uscire
cose del contenitore che alcuni non piaceranno
l’ i / o monad non ti permetterà di ottenere
le cose che ne dicono alcune di loro
okay, puoi uscire per il futuro
non puoi ottenere qualcosa che puoi
iscriversi a una notifica quando questo
succede e questo non fa parte del
meccanica del del monente noi
non mi interessa davvero quando parliamo
riguardo la monade è il contenitore che
definisce qualcos’altro che potrebbe essere
un’altra astrazione che definirà come
per estrarre le cose ce ne sono altre
come comonad ci sono mono è loro
pieghevole ci sono molte altre cose
anche tu puoi estrarre le cose ma
Mona è e non capita di essere uno di
preoccupandosi di questo tipo di aspetti
domande okay finora sei stato
parlando principalmente in modo astratto del
interfaccia del mo Ned si può parlare
più concretamente di ciò che questo dà
tu sei solo tu vedi questa cosa e
sai come usarlo
sì, quali sono alcuni esempi di te
potrebbe usare ti ho dato un esempio di a
elenco ora se T in 15 minuti posso I
non so quanto tempo ho avuto ma
Non ne posso, quindi è come se avessi mostrato il
lista Mona e a questo è molto
interessante perché è molto semplice
esempio di come lo usi tu
una lista di cose che ragionate su una
cosa come se fosse una cosa giusta e
date una funzione in modo da avere una lista
di ins e tu dici come va bene che posso
trasforma un int in una stringa che
mezzi come te e la Monade permetteranno
tu o il funtore di quella materia permetti
a trasformare l’ intera lista in
lista di stringhe proprio questo è un caso
un caso d’uso l’opzione era un altro caso
ma ci sono molti casi in cui puoi andare
attraverso ci sono molti esempi di
Mona’s ma sono esattamente gli stessi
semantica e tu conosci questa trasformazione
che cosa c’è dentro il contenitore e ri
appiattimento okay ma di nuovo nella lista
caso non ti interessa come la lista
è implementato è la meccanica del
implementazione della Mona proprio così
dal momento che non ho molto tempo
lo proverò ok per favore, per favore Christian
dimmi quando sono te se non ho
più tempo è già il caso
giusto e non vedo le mie console I
non vorresti farlo qui?
Comunque
okay vedo qualcosa di nuovo hmm built-in
presto vieni, vieni
questo è ok ok, quindi voglio andare a
console ora vai in Megan sta per
scarica Internet
ma in ogni caso, voglio dire che puoi farlo
basta cercare e ce ne sono molti
esempi di diversi tipi di Mona
ma è necessario catturare le idee principali
semantica condivisa, quindi qui ho qualcosa
se dico come se avessi una lista che ne ha ricevuta una
due tre e dico e probabilmente tu
non vedo niente, okay proviamo
per ingrandirlo dot map e sto prendendo un int
e restituendo una stringa di Dio un plus I
e ora ho se transita qualche volta
presto sì, così ottengo la lista di Dio che ho avuto
Devo averne tre e va bene lo so
Ho spazio qui nello spazio qui ora
posso restituire una lista di cose qui
per ogni oggetto sto restituendo una lista e
non nello stesso contenitore di un altro
un altro tipo quindi ho qui una lista di
ottenuto un e io non so cosa Wow e
qui devo usare così se ho usato il
functor qui quello che otterrò è una lista
di elenchi vediamo il tipo qui vedi
il tipo è una lista di liste di stringhe
non è molto bello, ho una lista
di lista del primo elenco e il secondo
elenca e così via se uso la mappa piatta allora
andrà appiattito e otterrò
qualcosa di carino che è una lista
appiattito di tutte queste liste e posso
applicarlo alle opzioni che posso applicare a
qualsiasi cosa giusta e, naturalmente, le lingue
poiché è molto molto interessante e
come questa camicie che modifica è molto
in generale forniscono anche la sintassi per
facendo ciò che è per la comprensione
qualunque cosa essi tendano a chiamarli
diverse lingue C sharp C Scala
qualunque altra lingua sia bella così
grazie ok, grazie

Please follow and like us: