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ą.
O ile rozumiem, strumienie Scheme są leniwymi wartościami, podczas gdy Monady są niestandardowymi łańcuchami obliczeń. – Salil
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
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