一个promise表示一个将来可能可用的值(或无法使用)。
我正在寻找的是一个数据类型,它表示一个将来可能变得不可用的可用值(可能是由于错误):
Promise a b = TransitionFromTo<PENDING, Either<value a, error b>>
??? a = TransitionFromTo<value a, Either<ENDED, FAILED>> or
??? a b = TransitionFromTo<value a, Either<ENDED, error b>>
字符串
这样的概念(或类似的)是否已经被探讨过了?是否存在现有的语义或常见的习惯用法?
例如,它可能表示一个打开的数据库连接,该连接将被关闭。我的特定用例是将FRP中的“可变”(即可变大小的集合)表示为这样的“结束值”流-当事件发生时,值被添加到集合中,当值“结束”时,它被删除。
我觉得将其表示为Signal<Option<value>>
或{data = value, ended = Promise<null>}
并不完全匹配-第一种情况不包括值最终解决为Nothing
的保证,第二种情况在结束后仍然可以访问data
字段。
4条答案
按热度按时间svgewumm1#
简而言之-可以使用异步生成器建模。
在DB连接示例中,从概念上讲,每次访问所产生的值时,都有一系列DB连接(可能异步)序列中的值(连接)。屈服可以是异步的,值本身也可能是异步的。序列可能会结束(使其永远不再可用)或者它可能总是产生结果-它可能保持挂起并且永远不再产生另一个连接。
值得一提的是,一个P2P生成器是你所追求的类型的一个巨大的 * 超集 *-它更有表现力,而且不是直接的逆。
在long - Inverse中如何实现?
你可以用几种不同的方式来反转一个promise。
promise是一个**单数的 * 时态的 getter*。也就是说,它持有以下内容:
引用克里斯关于承诺的暂时性的工作:
观察者可以订阅以最终看到promise的值。他们可以在promise具有值之前或之后这样做。任何数量的观察者都可以订阅多次,任何单个观察者都可以订阅同一个promise多次.... Promise是广播的.任何消费者都不能干涉另一个消费者的法律使得promise不可能中止正在进行的工作。promise代表一个结果,而不是导致这种结果的工作。
在每一个方面,promise的逆是不同的。
*Deferred是一个单一的时态setter。它是promise的对偶,它允许设置一个值,类似于promise允许获取它的方式。
如果你想要的东西在这三个方面都不同于promise-你需要更高级的东西。Generator在这方面是promise的逆,它是一个空间的,多值的setter。它在所有这些方面都是promise的对立面。
然而,你所谈论的是在两个方面都是可编程的东西,你想要的东西是既可用/不可用,又能改变值。这是一个可编程的生成器,这里使用的更复杂的类型之一。
你的类型需要类似于一个生成器,它有两次是cnc,一次是下一个值,一次是获取值本身,我问了a similar C# question here,这里是an interesting talk and lecture about it。
基本上,你需要一个值 * 和 *
next()
是异步的生成器。它相当复杂,几乎没有什么东西是它正确建模的(例如-无限滚动,滚动和内容都是异步的)。在某种意义上,序列结束表示您的值不再“不可用”,而生成下一个示例的序列表示您的信号暂时不再可用。
我也推荐Erik Meijer's talk和Kris Kowal's GTOR关于这个主题。
z3yyvxxp2#
promise是一个有序的三元组:
字符串
它的逆也必须是有序三元组:
型
但是,您不希望在值 * 开始 * 衰减时得到通知,这是立即的;相反,您希望在值 * 已经 * 衰减时得到通知。
型
通知带有
Dispose
的语义,实际上如果定义为IDisposable<T>
的话,和IDisposable
非常相似。型
它看起来像是
Task<T>
和IObservable<T>
的弗兰肯斯坦混合体。也许是
IDisposable
的dual?kxeu7u2r3#
你在你的标签中提到了'scala',所以:在jvm上,它可以作为一个软/弱参考来完成。你可以把这个概念移植到不同的技术上,但是你必须自己做内存管理。但是它更适合处理单个值,而不是流
cgyqldqp4#
E语言有references that can become Broken:
一个 Promise 可能会变成 Near、Far 或 Broken。另外,一个 Far 引用可能会变成 Broken。
Throwable
来指示是什么问题导致它没有指定一个对象。它不支持立即调用-如果尝试一个,它会抛出它的问题。它不支持最终发送-如果尝试一个,结果是一个引用被同样的问题破坏了。像 Near 一样,Broken 是一个终端状态(一旦 Broken 总是 Broken)。Broken 引用是传递不可变的,并且通过复制传递。