在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)))
}发布于 2021-01-13 07:13:25
如果您对Sequence的唯一反对意见是Nil情况,则可以定义
type rec stream<'a> = { x:'a, next:() => stream<'a> }与您的定义不同的是,我们正在创建一个新的递归类型,而不是试图定义一个递归类型表达式。
编辑:
使用元组和记录的区别在于元组是结构类型的,而记录是名义类型的。
这改变了平等和身份方面的一切。
特别是,最初的定义可以理解为
type stream0<'a> = ('a, () => 'b ) as 'b然后,每当您想要将类型stream0<'a>与元组类型进行比较时,可能需要将此缩写扩展为无限制的时间。
例如,这个函数的类型很好.
let f: stream0<int> => (int, ()=>(int,() => _)) = (x) => x或者这个:
let app_once = ((x,next)) => next ()这里的一个重要后果是,可以在期望有有限流的上下文中使用stream0<'a>。换句话说,流0<‘a>和流0<’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>及其许多类型的等式更麻烦而不是有用,这种递归类型在默认情况下是禁用的。
https://stackoverflow.com/questions/65691092
复制相似问题