承诺的反转是什么?

时间:2014-09-28 11:32:30

标签: scala haskell language-agnostic promise frp

承诺代表将来可能会出现的价值(或未能实现)。

我正在寻找的是一种数据类型,它表示将来可能无法使用的可用值(可能是由于错误):

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

3 个答案:

答案 0 :(得分:9)

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

在数据库连接示例中,从概念上讲,您每次访问该值时都会获得一系列数据库连接,这些值会从序列(连接)中产生(可能是异步)一个值。 Yielding可以是异步的,值本身也可能是异步的。序列可能会结束(使其永远不可用)或者它可能总是产生结果 - 它可能保持未决状态,并且永远不会再次产生另一个连接。

值得一提的是,异步生成器是您之后所用类型的巨大超集 - 它更具表现力并且不是直接逆转。

长 - 逆怎么样?

你可以用几种不同的方式反转承诺。

承诺是单数 时间 getter 。这就是它具有以下内容:

  • 它代表单个值。
  • 其值时间(即与时间有关)。
  • getter

引用Kris关于承诺暂时性的工作:

  

观察者可以订阅最终看到承诺的价值。他们可以在承诺有价值之前或之后做到这一点。任意数量的观察者可以多次订阅,任何一个观察者都可以多次订阅相同的承诺....承诺是广播。没有消费者可以干涉另一个消费者的法律使得承诺不可能中止正在进行的工作。承诺代表结果,而不是导致结果的工作。

每一个方面的承诺相反是不同的。

  • 延迟是一个单数的时间设定器。它是承诺的双重性,它允许设置一个类似于承诺允许获取它的值。

  • Reader (通常称为observable)是promise的多个版本,也是iterable的时态版本。它代表了暂时来临的多个价值观。这可以改变其价值。

  • ,最常用和最原始的东西之一是承诺的同步版本。

如果你想要的东西不同于三者中的承诺 - 你需要更先进的东西。在这方面,生成器是承诺的反转,它是一个空间的多值设定器。这与每一个方面的承诺相反。

然而,你所说的是在这两方面都是异步的,你想要的东西既可用/不可用又改变价值。这是一个异步生成器,是这里比较复杂的类型之一。

您的类型需要类似于两次异步的生成器,一旦获得下一个值,一次获取值本身,我就问a similar C# question here。这是an interesting talk and lecture about it

基本上,您需要一个值 next()为异步的生成器。它相当复杂,并且很少有正确建模的东西(例如 - 滚动和内容都是异步的无限滚动)。

从某种意义上说,序列结束表示你的价值&#34;不可用&#34;生成下一个实例的序列表示您的信号暂时不再可用。

我还建议Erik Meijer's talkKris Kowal's GTOR关于此主题。

答案 1 :(得分:2)

承诺是有序的三重奏:

Time -> Notification -> Value

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

Value -> Notification -> Time

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

Value -> Time -> Notification

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

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

它看起来像Task<T>IObservable<T>的科学怪人混合体。

IDisposable的异步对偶可能?

答案 2 :(得分:0)

你在标签中提到'scala',所以:在jvm上它可以作为软/弱引用来完成。您可以将该概念移植到不同的技术,但必须自己进行内存管理。但它更适合处理单个值而不是流