为什么promise不是Scheme中的数据类型?

问题描述 投票:0回答:3

Scheme 中

delay
返回的对象是“一个 Promise”,但 Promise 不被视为类型(因此没有
promise?
过程,并且在 R5RS 或 R6RS 中没有将其列为类型)。

为什么会这样?有强烈的共鸣吗?例如,对我来说,做类似

(if (promise? x) (force x) x)
的事情似乎很自然。 (我发现有些实现会让我强制执行非承诺,而其他实现则不会)。另外,如果我可以将某些东西存储在变量中并将其传递,我觉得它应该有一个类型。

scheme lazy-evaluation
3个回答
4
投票

不可能有那么有力的理由,因为 MIT/GNU 方案定义了一个

promise?
函数。


4
投票

我认为它可以更优化地实现

delay/force
。事实上,强制值可以被记忆(这样一个 Promise 只被强制执行一次,结果值会在后续的
force
调用中返回)模糊了 Promise 和它的结果值之间的区别。如果你有
promise?
,你就无法在任何需要的地方用它的价值来替代强制承诺。因此,根据实现的不同,promise 可能与任何其他 Scheme 值无法区分。


0
投票

如上所述,

promise?
不在 R5RS 或 R6RS 中(这将
delay
force
降级到 R5RS 兼容性库)...但 R7RS 将它们带回到
(scheme lazy)
中,并添加,以及其他一些例程,
promise?
,并提供以下建议:

请注意,promise 不一定与其他方案类型(例如过程)脱节。

这为不同的实现策略留下了很大的空间,包括经典的let-over-lambda风格,其中承诺是一个函数。

© www.soinside.com 2019 - 2024. All rights reserved.