我已經看到流被用作comonad的默認示例,但我不能完全確定它們是如何無限的,但不是。Haskell Streams(Comonadic):無限?
假設我們有數據的構造函數(from here)
data Stream a = a :> Stream a
我們如何最終完成從流?我們寫在最後有沒有定義?我知道這種語言是懶惰的,但在某個地方必須剪掉結,對吧?我錯了嗎?
我已經看到流被用作comonad的默認示例,但我不能完全確定它們是如何無限的,但不是。Haskell Streams(Comonadic):無限?
假設我們有數據的構造函數(from here)
data Stream a = a :> Stream a
我們如何最終完成從流?我們寫在最後有沒有定義?我知道這種語言是懶惰的,但在某個地方必須剪掉結,對吧?我錯了嗎?
流本身是無限的;您無法創建有限的流。比較Stream
和List
:
data List a = Empty | a : List a
data Stream a = a :> Stream a
您可以創建因爲Empty
構造一個有限列表;有可能創建一個List
值,而不涉及另一個List
值。 A Stream
值,另一方面,可以只用通過使用創建另一個Stream
值。 任何時間模式匹配Stream
,你會得到一個值a
和另一個Stream
值。
「完成」一個流只是意味着你停止從它中提取值,而不是你達到流的「結束」。
實際上,這意味着你不能在內存中實例化一個完整的流;您只能按需構建它,通常通過調用函數在構造函數:>
上的模式匹配時生成流的其餘部分。
雖然在指稱上完全合理,但最後一段(關於「在記憶中實例化一個完整的流」)在操作上不正確 - 這正是打結給你的結果!例如,給定定義'ones = 1:> ones',流將由一個指向自身的單個「cons」單元表示(一旦thunk消失)。 –
一個更現實的場景是用戶按下的按鍵流:你將它視爲一個無限流,因爲從來沒有一個按鍵被認爲是最後一個(現在忽略ctrl-D)。程序結束時發生終止,而不是流結束時終止。 –
@ AntalSpector-Zabusky可以很好地解答問題。另外,所有的流都是圓形的呢? –
如果你完成它不會是無限的,是吧? –