首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReScript中的无限列表/流

ReScript中的无限列表/流
EN

Stack Overflow用户
提问于 2021-01-12 19:51:10
回答 1查看 196关注 0票数 2

在ReScript中,我似乎找不到无限列表的正确类型。

我第一次尝试:

代码语言:javascript
复制
type rec stream<'a> = ('a, () => ('a, stream<'a>))

这是不正确的,因为ReScript认为这种类型是循环的。所以我试着:

代码语言:javascript
复制
type rec stream<'a> = ('a, Lazy.t<() => ('a, stream<'a>)>)

这还是给了我一个类型错误。

最终,我试图让这段代码正常工作,但由于类型签名是无限的,它失败了。

代码语言:javascript
复制
let rec from: (int, Lazy.t<() => (int, Lazy.t<...>) = (x: int) => {
    (x, () => Lazy.from_fun(from(x+1)))
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 07:13:25

如果您对Sequence的唯一反对意见是Nil情况,则可以定义

代码语言:javascript
复制
type rec stream<'a> = { x:'a, next:() => stream<'a> }

与您的定义不同的是,我们正在创建一个新的递归类型,而不是试图定义一个递归类型表达式。

编辑:

使用元组和记录的区别在于元组是结构类型的,而记录是名义类型的。

这改变了平等和身份方面的一切。

特别是,最初的定义可以理解为

代码语言:javascript
复制
type stream0<'a> = ('a, () => 'b ) as 'b

然后,每当您想要将类型stream0<'a>与元组类型进行比较时,可能需要将此缩写扩展为无限制的时间。

例如,这个函数的类型很好.

代码语言:javascript
复制
let f: stream0<int> => (int, ()=>(int,() => _)) = (x) => x

或者这个:

代码语言:javascript
复制
let app_once = ((x,next)) => next ()

这里的一个重要后果是,可以在期望有有限流的上下文中使用stream0<'a>。换句话说,流0<‘a>和流0<’a>的有限版本之间有许多潜在的相等。

相反,stream<'a>的记录定义创建了一个新的、不同类型的构造函数stream。因此,stream<'a>只能等于stream<'a>。换句话说,为stream<'a>设计的函数

代码语言:javascript
复制
let app_once  = {x;next} => next(())

无法使用该类型。

代码语言:javascript
复制
type one_stream<'a> = { x:'a, next:() => ('a, ()) }

实际上,递归类型的stream0<'a>及其许多类型的等式更麻烦而不是有用,这种递归类型在默认情况下是禁用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65691092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档