2015-08-23 9 views
6

entuzjastą rozwoju oprogramowania noted the following:Jaki jest związek między funkcjami generatora i monad w JavaScript?

Aktualny status: kompulsywnie przepisanie wszystkich moich JS po dokonaniu intuicyjny połączenie między funkcjami generatora i listowe monady.

Czułem, że coś tam przeoczyłem. Moim rozwiązaniem piekła oddzwaniania było użycie czegoś takiego jak js-csp (tj. Kolejka).

Moje pytanie brzmi: Jakie jest połączenie między funkcjami generatora i monad w JavaScript?

+0

Cóż, autor także musiał coś przegapić. Funkcje generatora nie są pojęciami monad. – Bergi

+0

Jakie jest Twoje zdanie na temat kolejnych komentarzy na oryginalnym tweecie? – hawkeye

+1

@mrmcgreg: Tyle tylko, że autor nie używa generatorów w ogóle w tym artykule. Wydaje się mylić je z iteratorami. – Bergi

Odpowiedz

5

Nie ma.

Podczas gdy funkcje generatora mogą wyglądać bardzo podobnie do zapisu monad (tj. do notacja), nie są one takie ogólne. Głównym problemem jest to, że generatory ES6 mają charakter stanowy i mogą być rozwijane tylko raz na kontynuację. Spróbuj wprowadzić monadę listy i zobacz, jak to się nie udaje.

Prawdziwe Ułatwienia Monad można osiągnąć za pomocą języka kompilacji to-JS, który obsługuje ich (jak LatteJs, monadic, PureScript lub LispyScript) lub sweet.js macros. Zwykle rezygnują z wywołań zwrotnych - tak jak w Haskell.

+0

Jakie jest Twoje zdanie na temat kolejnych komentarzy na oryginalnym tweecie? – hawkeye

+0

@hawkeye: Które z nich konkretnie wybierasz? – Bergi

+0

Ten, w którym oryginalny autor mówi "Buduj monadyczne kombinatory parsera z funkcjami generatora? Oczywiście, nie ma problemu". a następnie linki do: https://github.com/bodil/graham/blob/master/parse.js#L10 – hawkeye

1

Nie, postrzegana intuicyjna natura jest słaba.

Kolejne wyliczenia zbiorów wyglądają jak zagnieżdżone kontynuacje, tak jak w monadach sekwencyjnie współbieżnych, ale każdy kolejny "efekt" w dowolnej monadzie wymaga , a nie wymagać powtórnej/nieokreślonej aplikacji.

Można zaimplementować instancję monady z generatorami, ale myślę, że to tak daleko, jak idzie związek (niekoniecznie intuicyjny); Monady wydają się dużo bardziej ogólne.

Termin zrozumienie monady wydaje się odnosić do rozumienia listy wykonawczej jako monady. Zobacz Comprehending Monads (wprowadzenie i część 2.2). Jednakże, powszechnie w rozwoju JS, "zrozumienie monady", wydaje się być używane zamiennie z "monadą".

I nigdy nie słyszałem o "wznowieniu" i nie mogę znaleźć definicji/podstawy dla tego.

Nie mam teraz dostępu do Twittera, ale może twój przyjaciel próbuje stworzyć bibliotekę leniwych lodashów/podkreślników/list-homomorfizmów?

+0

Jakie jest Twoje zdanie na temat kolejnych komentarzy na oryginalnym tweecie? – hawkeye

+0

Nawet jeśli może to być trochę wybredna, dwa wyjaśnienia: Ponieważ generatory są tylko iteratorami, iteratory są podwójnymi obserwatorami. Poza tym generatory nie utrzymują kontynuacji, ale wznowienia, ponieważ te pierwsze powinny zawsze być w pozycji ogonowej. – ftor

+0

Ta odpowiedź jest błędna - Oto biblioteka implementująca Do-Notation/Monad Comprehension z wykorzystaniem funkcji generatora: https://github.com/pelotom/burrido ~ Ponadto: Podczas gdy monady i pojmowanie mogą nie być równoważnymi pojęciami, są mocno powiązane; na przykład zarówno mapę, jak i płaską część monady można odzyskać za pomocą zrozumienia monady. –

Powiązane problemy