【发布时间】:2021-01-14 11:13:11
【问题描述】:
我似乎无法为 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)))
}
【问题讨论】:
-
您可以重用 OCaml 的 Seq,它是一个无限流:caml.inria.fr/pub/docs/manual-ocaml/libref/Seq.html - 它没有任何原生依赖项,因此您应该可以直接将其复制并粘贴到您的项目中。
-
是的,我可以用一个变体和某种结束列表的方式来做到这一点,我只是想避免这种情况
-
有一个
-rectypes标志,你可以传递编译器,它应该让它接受这个。 -
为了提供更多关于我为什么要避免它的上下文。我希望某人总是能够获得
next,即使“结束”发生,因为next不断返回None。因此,类型本身定义了永远会有下一个,而不是假装/希望永远存在。我希望这是有道理的。
标签: ocaml reason bucklescript rescript