簡體   English   中英

ReScript 中的無限列表/流

[英]Infinite Lists / Streams in ReScript

我似乎無法在 ReScript 中找到無限列表的正確輸入。

我第一次嘗試:

type rec stream<'a> = ('a, () => ('a, stream<'a>))

這是不正確的,因為 ReScript 認為該類型是循環的。 所以我嘗試了:

type rec stream<'a> = ('a, Lazy.t<() => ('a, stream<'a>)>)

這仍然給了我一個類型錯誤。

最終我試圖讓這段代碼工作但由於類型簽名是無限的而失敗了。

let rec from: (int, Lazy.t<() => (int, Lazy.t<...>) = (x: int) => {
    (x, () => Lazy.from_fun(from(x+1)))
}

如果您對Sequence的唯一反對意見是Nil情況,您可以定義

type rec stream<'a> = { x:'a, next:() => stream<'a> }

與您定義的不同之處在於我們正在創建一個新的遞歸類型,而不是試圖定義一個遞歸類型表達式。

編輯:

使用元組或記錄的區別在於元組是結構類型的,而記錄是名義類型的。

這改變了平等和身份方面的一切。

特別地,原始定義可以理解為

type stream0<'a> = ('a, () => 'b ) as 'b

然后,每當有人想要將類型stream0<'a>與元組類型進行比較時,可能需要無限次地擴展此縮寫。

例如,這個 function 是類型良好的。

let f: stream0<int> => (int, ()=>(int,() => _)) = (x) => x

或者這個:

let app_once = ((x,next)) => next ()

這里的一個重要結果是可以在預期有限 stream 的上下文中使用stream0<'a> 換句話說,在 stream0<'a> 和 stream0<'a> 的有限版本之間有許多潛在的相等性。

相反, stream<'a>的記錄定義創建了一個新的不同類型構造函數stream 因此, stream<'a>只能等於stream<'a> 換句話說,為stream<'a>

let app_once  = {x;next} => next(())

無法使用該類型

type one_stream<'a> = { x:'a, next:() => ('a, ()) }

在實踐中, stream0<'a>的遞歸類型和它的許多類型等價性比有用更麻煩,並且默認情況下禁用此類遞歸類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM