2017-06-06 53 views
1

我已經看到流被用作comonad的默認示例,但我不能完全確定它們是如何無限的,但不是。Haskell Streams(Comonadic):無限?

假設我們有數據的構造函數(from here

data Stream a = a :> Stream a 

我們如何最終完成從流?我們寫在最後有沒有定義?我知道這種語言是懶惰的,但在某個地方必須剪掉結,對吧?我錯了嗎?

+5

如果你完成它不會是無限的,是吧? –

回答

6

流本身是無限的;您無法創建有限的流。比較StreamList

data List a = Empty | a : List a 
data Stream a =   a :> Stream a 

您可以創建因爲Empty構造一個有限列表;有可能創建一個List值,而不涉及另一個List值。 A Stream值,另一方面,可以只用通過使用創建另一個Stream值。 任何時間模式匹配Stream,你會得到一個值a和另一個Stream值。

「完成」一個流只是意味着你停止從它中提取值,而不是你達到流的「結束」。

實際上,這意味着你不能在內存中實例化一個完整的流;您只能按需構建它,通常通過調用函數在構造函數:>上的模式匹配時生成流的其餘部分。

+3

雖然在指稱上完全合理,但最後一段(關於「在記憶中實例化一個完整的流」)在操作上不正確 - 這正是打結給你的結果!例如,給定定義'ones = 1:> ones',流將由一個指向自身的單個「cons」單元表示(一旦thunk消失)。 –

+2

一個更現實的場景是用戶按下的按鍵流:你將它視爲一個無限流,因爲從來沒有一個按鍵被認爲是最後一個(現在忽略ctrl-D)。程序結束時發生終止,而不是流結束時終止。 –

+0

@ AntalSpector-Zabusky可以很好地解答問題。另外,所有的流都是圓形的呢? –