2012-05-07 17 views
13

Czy istnieje jakaś różnica między strumieniami (leniwymi listami) a monadami? Z pojęciowego i matematycznego punktu widzenia, a nie z technicznego wykonania.Strumienie kontra monady

Czy istnieje między innymi biunique, jedna do jednej korespondencji?

Dokładniej, jako strumienie, oznacza "równomierne strumienie" z poziomu SRFI-41 języka Scheme.

Czy to kolejna kategoria niż monady? Jeśli tak, to jaką to jest kategorię?

Czy "równomierne strumienie" gwarantują kontrolę efektów ubocznych, takich jak monady?

+0

O ile rozumiem, strumienie Scheme są leniwymi wartościami, podczas gdy Monady są niestandardowymi łańcuchami obliczeń. – Salil

+0

Strumienie są dokładnie leniwymi listami. W jaki sposób "leniwe wartości" mogą być prezentowane bez monad lub ponownie leniwych list lub czegoś podobnego? Nie należy mylić "leniwych wartości" z niezmiennymi zmiennymi funkcjonalnymi. No i czy "niestandardowe łańcuchy obliczeń" mają powiązanie jeden do jednego z "równymi strumieniami"? – cofp

+0

Dobrze. Porównaj definicje "parzystych strumieni" i monad. A także ich aksjomaty. Jak wiem, każdy strumień można wyrazić za pomocą monady. Czy to prawda, co każda monadyczna "wartość" lub "obliczenie" można wyrazić za pomocą "równomiernego strumienia"? Czy jest jakieś ograniczenie? – cofp

Odpowiedz

5

Jak Salil już wspomniano, dwa różne pojęcia:

strumień jest (potencjalnie nieskończona) wykaz wartości, zazwyczaj, ale niekoniecznie, obliczane w leniwe sposób, to znaczy tylko przechowywanie jakiś sposób obliczania wartości na żądanie. Jest wiele przykładów wokół, że nie wiążą się monady w dowolny sposób:

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers)) 

Jest to dość przydatna również rozważyć skończony, precomputed, list jako strumienie, ponieważ można z nich korzystać w dowolnym miejscu a (potencjalnie lub niekoniecznie) skończony można użyć leniwego strumienia.

Strumień jest więc operacją next: streamType -> (valueType streamType), aby uzyskać następną wartość i pozostały strumień.

 

Monady, z drugiej strony, są mniej struktury danych, a raczej sposób pisania kodu źródłowego, łącząc poszczególne komendy.

Prawdopodobnie najprostszym użytecznym przykładem jest "Być może monada" - nie jestem pewien, jak by to wyglądało w Scheme, przepraszam, ale pomysł jest następujący: Biorąc pod uwagę listę obliczeń (f g h) i dane wejściowe x, wykonaj obliczenia w porządku, prawie tak, jakby były podane (f (g (h x))), ale niech każda funkcja zawodzi z wdziękiem: Jeśli g zwraca nil, nie wywołuj (f nil), ale zamiast tego natychmiast zwróć nil.

 

Można oczywiście połączyć dwa w różnych przydatnych sposobów i obliczyć swoje wartości strumieniowych z monad lub hermetyzacji wykorzystanie strumieni jakbym strumieni wejścia/wyjścia, które nie są dokładnie następujących oczekiwania programowania funkcyjnego w monadzie (aby uniknąć kodu przechowującego odniesienie do poprzedniego stanu strumienia), ale służą one zupełnie innym celom. Pomyśl o warstwie abstrakcji (zamknij pokrywę, nie patrz na wnętrzności): Monada zastosowana do funkcji daje ci funkcję. Z drugiej strony strumień nie jest jakąś wyższą funkcją, ale listą wartości.

Oczywiście funkcja zdefiniowana przez (lub zwrócona z, w zależności od punktu widzenia) monada może być implementacją strumienia, a także wartości wyodrębnione ze strumienia mogą być monadami. Ale jak widać powyżej, istnieją monady implementujące rzeczy zupełnie różne od strumieni. To, czy strumienie nie są zaimplementowane jako monady, prawdopodobnie zależy od tego, do czego dokładnie używasz tego terminu. Muszę przyznać, że w tej chwili nie jestem pewien, czy nieskończone strumienie właściwie kwalifikują się jako monady; skończone listy oczywiście robią.

+0

Twoja odpowiedź jest znacznie bardziej użyteczna. A sprzeciw wobec poprzedniej odpowiedzi nie był sprzeczny z żadną różnicą. Po prostu było sprawą pytania, aby znaleźć różnicę. Ale obiekcje wobec poprzedniej odpowiedzi były przeciwne równaniu "leniwych wartości" z obietnicami Scheme. I przeciwko czemuś innemu, ale nie przeciwko żadnej różnicy. – cofp

+0

W tekście pytania znalazła się sugestia, aby nie wyglądać "pod przykryciem". Czym różni się "struktura danych" od "sposobu" robienia czegoś ("pisania kodu")? Z punktu widzenia abstrakcji czasu i stanów. Powiedzieć, że coś jest mniej więcej "strukturą danych". Czy są to struktury "leniwych list" czy po prostu "droga"? Ponieważ stwierdzenie, że "strumienie są dokładnie leniwymi listami" było tylko sprzeciwem wobec "leniwych wartości". Z tego nie wynika, że ​​strumień to dokładnie "struktury danych". – cofp

+0

Twoje rozumowanie o "wyższej funkcji" to silniejsze IMHO. Chociaż nadal potrzebuje dowodu, że nie ma sposobu, aby użyć "równych strumieni" jako wyższych funkcji. Więc byłoby udowodnione, że strumienie są bardziej restrykcyjne niż modady. Ale mówiąc, że są * całkowicie * różne, nie zapominaj, że strumienie można wyrazić za pośrednictwem monad. Strumienie są więc tylko podkategorią monad. Ale czy ta podkategoria jest ścisłym "sub"? Czy jest to tylko częściowe przecięcie? IMHO pytanie jest otwarte. – cofp