Gandrīz neviens uz vakardienas aptauju par monādēm, neatbildēja, ka var tās paskaidrot, tāpēc te ir mans tikai mazliet izplūdušais skaidrojums 17 atbildes
Reinis Ivanovs (2023-03-31 19:00:05) |
Gandrīz neviens uz vakardienas aptauju par monādēm, neatbildēja, ka var tās paskaidrot, tāpēc te ir mans tikai mazliet izplūdušais skaidrojums | ||
Reinis Ivanovs (2023-03-31 19:05:54) |
Monādes pavisam īsumā ir datu tips, kas ļauj kodā izteikt secīgas darbības, kas nodod viena otrai tālāk savu kontekstu jeb ir pakārtotas, bet darīt to "plakanā" stilā jeb nepakārtojot (nenestojot) pašu kodu arvien dziļāk | ||
Reinis Ivanovs (2023-03-31 19:09:06) |
Imperatīvā programmēšana ir tādas pašas secīgas vienā līmenī izteiktas darbības, kuras atdala ar semikolu, un tāpēc monādes var aprakstīt kā "programmējamus semikolus", kas piedod šiem atdalījumiem papildus uzvedību (tādu kā gaidīt uz event loopu) https://t.co/x40uUmzIsF | ||
Reinis Ivanovs (2023-03-31 19:10:00) |
Pati aptauja https://t.co/GsOD22JAlm | ||
Reinis Ivanovs (2023-03-31 19:13:31) |
Es to arī paskaidroju klipā, bet monādes savu sarežģītību attaisno ar to, ka tā ir bagātīga (rich) vai jaudīga abstrakcija, jo piemērojama tik daudzos gadījumos | ||
Reinis Ivanovs (2023-03-31 19:19:41) |
Konkrēts piemērs kaut kam monādveidīgam, ar ko daudzi būs saskārušies, ir Promise objekti JavaScriptā, ar ko kombinē darbības ar vērtībām vēl pirms tās pastāv, un tas ir piemērs, kā tiek abstrahēta asinhrona kontroles plūsma | ||
Reinis Ivanovs (2023-03-31 19:23:43) |
Tieši par asinhronitāti runājot, es ļoti silti iesaku arī savu paskaidrojumu par to, ka tas ir izpildes modelis, kurā izpilde notiek atšķirīgos laikos un sazinās savā starpā, padodot ziņas/kontinuācijas https://t.co/PcBhXsoA9X | ||
Reinis Ivanovs (2023-03-31 19:27:28) |
Vienkāršākais un tradicionālais paņēmiens, kā šo modeli izteikt kodā, ir CPS, bet no tā izriet gan minētā posta piramīda (pyramid of doom), gan tas, ko sauc par callback hell, un promises to atrisina https://t.co/k6XfUlx5aq | ||
Reinis Ivanovs (2023-03-31 19:31:15) |
Bēdīgā slava monādēm ir tāpēc, ka tās nāk no matemātikas un konkrēti no kategoriju teorijas, un ir daudz mulsinošu mēģinājumu iepazīstināt cilvēkus ar tām, sākot ar to, ka tas ir algebrisks datu tips | ||
Reinis Ivanovs (2023-03-31 19:34:08) |
To var nepamanīt, ja izmanto .then() sintaksi, bet plašākā būtība ir, ka monādes ļauj strukturēt kodu tāpat kā matemātiskā pierakstā, jeb kombinēt funkcijas tādā pašā veidā, kā to dara matemātikā | ||
Reinis Ivanovs (2023-03-31 19:35:27) |
Teorētiskais skaidrojums ir, ka monāde ir jebkurš tips, kurš atbilst monādiskajiem likumiem vai aksiomām, jeb labajai un kreisajai identitātei un asociativitātei | ||
Reinis Ivanovs (2023-03-31 19:39:15) |
JavaScript promises tāpēc ir tikai monādveidīgas vai monādīgas, jo JS standartizācijas komiteja neuzskatīja, ka būtu vērts būt pilnīgi korektiem, un diskusijā tā tika nosaukta par fantāziju, ka JS varētu būt īsta funkcionālās programmēšanas valoda | ||
Reinis Ivanovs (2023-03-31 19:41:49) |
Atbildē uz šo diskusiju tika izveidota fantasy land specifikācija ar JS domātiem algebriskajiem tipiem, un šajā diagrammā var redzēt, ka monādes apvieno funktoru, apply un aplikatīvās algebras https://t.co/CKQOY37RYc https://t.co/pvVpBOOoXv | ||
Reinis Ivanovs (2023-03-31 19:44:05) |
Kategoriju teoriju žargons ir diezgan drausmīgs, bet funktorus var saprast kā konteinerus, kuru saturam var piemērot secīgas darbības, un, piemēram, JS masīvi (arrayi) ir funktori, jo ar var rakstīt "ķēdes" ar .map() izsaukumiem | ||
Reinis Ivanovs (2023-03-31 19:56:00) |
Monādes ir sarežģītāki funktori, kurus tāpēc var vairāk veidos kombinēt, bet tas ir pats galvenais, ka var rakstīt ķēdes ar darbībām, kas padod tālāk skaitļošanas kontekstu, un tāpēc ļauj modelēt daudz dažādus "problēmu domēnus" | ||
Reinis Ivanovs (2023-03-31 19:59:04) |
JS tika projektēta, lai tajā varētu modelēt lietotāju interakcijas ar lapām kā notikumiem, un tāpēc JS kopš iesākuma ir bijušas funkcijas kā t.s. pirmšķirīgie vai pirmās klases objekti, kas nozīmē, ka tās var padot tālāk kā argumentus citām funkcijām | ||
Reinis Ivanovs (2023-03-31 20:02:54) |
Visas valodas nav tādas, kurās būtu iespējams t.s. augstākās pakāpes (higher-order) programmēšana, jeb tāda, kur funkcijas var saņemt funkcijas kā argumentus un atgriezt funkcijas kā rezultātus, un PHP piemērs valodai, kur iesākumā nekas līdzīgs nebija iespējams | ||
Reinis Ivanovs (2023-03-31 20:43:44) |
Te pie reizes ir avots par "uz dzelzceļu orientēto programmēšanu", par ko ir jocīgs kontekts, ka tas ir intuitīvs paskaidrojums par monadēm, kas tās speciāli pat nepiemin https://t.co/YOaC8zPUOC |