sicp中的流模式在實際開發中有什麼應用?

sicp在第三章中引入了流,通過流來描述時間序列,可書上用的都是數學例子,所用技法都是比較難想出來的,我想到的就是Python中的迭代器跟這種模式有點相近,但又不太相同。。

我想問問各位大神有在實際開發中用過這種模式嗎?在C和C++這類沒有延時求值對的語言中有用武之地嗎?


謝邀.

SICP ch3里的流其實就是惰性的列表, 確實與iterator pattern相似.

但是更加有意思的地方是ch3 後半部分探討的問題: 狀態, 牽涉到狀態並發就不好做了, 在流這一節最後一部分給出了一個有趣的觀點: 把狀態看成是時間的函數 state = f(t), 這樣以來狀態就成了可以可以組合(compose)的東西.

在實際開發中的應用就是Rx框架, 一個圈圈就是一個事件,

要看各種圈圈的點這裡RxMarbles: Interactive diagrams of Rx Observables


謝邀!

你的感覺沒錯,iterator模式就是一個典型的例子。

如果還覺得不對勁的話,可以看看C++ Range Proposal(D4128: Ranges for the Standard Library: Revision 1)。

延時計算使用非常廣泛,比如Futures/promises(當然其中已經不僅僅是延時了),比如Python的yield,比如C#的async/await。

還有像Haskell這樣的編程語言,本身就是lazy by default的。

一方面,就是call by need,也就是說,在我需要的時候才會求值,不會浪費太多的計算在無用的事情上。

比如你要去讀一個文本文件特定的某一行,等待以後處理,lazy的話,只是會保存你的文件句柄和行號,在你真的要對該行文本處理的時候才會去讀取然後處理,而非lazy的處理過程可能會是直接打開文件,讀取到該行文本,然後直接交給你。(嗯,就是I/O Stream)

另一方面,這種設計可以增強任務的非同步性和並行性,也就是說,我可以把要計算的東西切換到另一個線程/進程去執行,等他得到結果之後我可能才會需要對其處理。一個很明顯的例子就是Promise模式。

延伸一點的話,像libevent這種都算是類似的應用。

另外,C++怎麼就沒有延時求值了?Functor / Iterator / Stream / Lambda又不是擺設。

以及:lazy.c(一時找不到例子了自己弄了個丑的)


我的項目中用到了流式的概念。對於Python,使用了yield關鍵字,對於Web框架Django,用了StreamRespon,對於js,用了EventSource。

簡單的場景:

假設載入一個有20個子項的列表,由於存在跨系統的調用,所以每個子項需要0.5s,加在一起就是10秒,如果要等待全部子項載入完,對於用戶來說體驗並不好。使用流的話,就可以0.5秒載入出來一個,可以讓用戶感覺舒適一些

流的效果就相當於進度條,好了一點點就給你顯示一點點增長,比花一段很長很長的時間從0直接顯示到100要好得多。

其實系統如果完全支持非同步更好,一次把請求全部發出去,響應回來一個往流里寫一個,這樣流會更加快速,體驗也贊的一比~


node.js中的流模式有些那個味道。


Reactive style Programming

https://gist.github.com/staltz/868e7e9bc2a7b8c1f754


實際開發中肯定有啊,C#中的LINQ算是最常用的吧。


推薦閱讀:

TAG:函數式編程 | SICP | 惰性求值 |