scala promise的反义词是什么?

oipij1gg  于 6个月前  发布在  Scala
关注(0)|答案(4)|浏览(84)

一个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字段。

svgewumm

svgewumm1#

简而言之-可以使用异步生成器建模。

在DB连接示例中,从概念上讲,每次访问所产生的值时,都有一系列DB连接(可能异步)序列中的值(连接)。屈服可以是异步的,值本身也可能是异步的。序列可能会结束(使其永远不再可用)或者它可能总是产生结果-它可能保持挂起并且永远不再产生另一个连接。
值得一提的是,一个P2P生成器是你所追求的类型的一个巨大的 * 超集 *-它更有表现力,而且不是直接的逆。

在long - Inverse中如何实现?

你可以用几种不同的方式来反转一个promise。
promise是一个**单数的 * 时态的 getter*。也就是说,它持有以下内容:

  • 它代表一个单个值。
  • 它的值是temporal(即依赖于时间)。
  • 这是一个getter

引用克里斯关于承诺的暂时性的工作:
观察者可以订阅以最终看到promise的值。他们可以在promise具有值之前或之后这样做。任何数量的观察者都可以订阅多次,任何单个观察者都可以订阅同一个promise多次.... Promise是广播的.任何消费者都不能干涉另一个消费者的法律使得promise不可能中止正在进行的工作。promise代表一个结果,而不是导致这种结果的工作。
在每一个方面,promise的逆是不同的。

*Deferred是一个单一的时态setter。它是promise的对偶,它允许设置一个值,类似于promise允许获取它的方式。

  • 一个Reader(通常称为Observable)是一个promise的多个版本,也是一个iterable的临时版本。它表示多个临时出现的值。它就像一个可以改变其值的promise。
  • 一个Value,最常用和最原始的东西之一是promise的同步版本。

如果你想要的东西在这三个方面都不同于promise-你需要更高级的东西。Generator在这方面是promise的逆,它是一个空间的,多值的setter。它在所有这些方面都是promise的对立面。
然而,你所谈论的是在两个方面都是可编程的东西,你想要的东西是既可用/不可用,又能改变值。这是一个可编程的生成器,这里使用的更复杂的类型之一。
你的类型需要类似于一个生成器,它有两次是cnc,一次是下一个值,一次是获取值本身,我问了a similar C# question here,这里是an interesting talk and lecture about it
基本上,你需要一个值 * 和 * next()是异步的生成器。它相当复杂,几乎没有什么东西是它正确建模的(例如-无限滚动,滚动和内容都是异步的)。
在某种意义上,序列结束表示您的值不再“不可用”,而生成下一个示例的序列表示您的信号暂时不再可用。
我也推荐Erik Meijer's talkKris Kowal's GTOR关于这个主题。

z3yyvxxp

z3yyvxxp2#

promise是一个有序的三元组:

Time -> Notification -> Value

字符串
它的逆也必须是有序三元组:

Value -> Notification -> Time


但是,您不希望在值 * 开始 * 衰减时得到通知,这是立即的;相反,您希望在值 * 已经 * 衰减时得到通知。

Value -> Time -> Notification

通知带有Dispose的语义,实际上如果定义为IDisposable<T>的话,和IDisposable非常相似。

public interface IDisposable<T out>
{
  T Value { get; }
  IDisposable Subscribe(Action disposedAction);
  void Dispose();  // Not entirely necessary, perhaps.
}


它看起来像是Task<T>IObservable<T>的弗兰肯斯坦混合体。
也许是IDisposable的dual?

kxeu7u2r

kxeu7u2r3#

你在你的标签中提到了'scala',所以:在jvm上,它可以作为一个软/弱参考来完成。你可以把这个概念移植到不同的技术上,但是你必须自己做内存管理。但是它更适合处理单个值,而不是流

cgyqldqp

cgyqldqp4#

E语言有references that can become Broken
一个 Promise 可能会变成 NearFarBroken。另外,一个 Far 引用可能会变成 Broken

  • 一个 Near 引用是一个熟悉的单机对象编程语言。它是一个引用箭头,其中头部和尾部都在同一个Vat中,箭头头附加到被指定的对象。Being Near 是一个最终状态:一旦引用是 Near,它就永远是 Near。因此,Near 引用不受分区的影响。Near 引用支持即时调用和最终发送。即时调用保证到达其接收者。最终发送的消息保证根据部分顺序传递,除了通过检查点/复活。
  • Eventual 引用严格地弱于 Near 引用。它只支持最终发送,只有失败停止保证,而不是保证传递。失败停止意味着,如果它来指定一个对象,它将根据部分顺序向该对象传递消息,直到它失败。一旦它失败,它将不再传递任何消息,它最终将成为 Broken
  • Broken 引用严格地弱于 EventualNear 引用。它不会也永远不会指定一个对象。相反,它持有一个Throwable来指示是什么问题导致它没有指定一个对象。它不支持立即调用-如果尝试一个,它会抛出它的问题。它不支持最终发送-如果尝试一个,结果是一个引用被同样的问题破坏了。像 Near 一样,Broken 是一个终端状态(一旦 Broken 总是 Broken)。Broken 引用是传递不可变的,并且通过复制传递。

相关问题