组件、隔离功能和 'referential transparency'
Components, Isolate function, and 'referential transparency'
我有一个(相当哲学的)问题,它涉及 cyclejs
个组件:Is isolate() referentially transparent?。
查看此后复制的简化代码,我无法区分 'impurity' 的任何来源。那是因为未简化的代码引入了它,还是因为该函数将 return 具有两个不同引用的两个不同对象?
在那种情况下,这两个对象不会具有相同的行为(即监听和响应相同目标上的相同事件,并生成不同的 vTree$ 但封装完全相同的序列吗?)。如果是这样,那么这两个对象本质上不是相同的吗,即在程序中的任何地方用另一个替换另一个不应该改变任何东西吗?这意味着 isolate
是引用透明的?我哪里错了?
实际上,如果两个调用 returns 无法替代的不同对象,这些对象有何不同?
function isolate(Component, scope) {
return function IsolatedComponent(sources) {
const {isolateSource, isolateSink} = sources.DOM;
const isolatedDOMSource = isolateSource(sources.DOM, scope);
const sinks = Component({DOM: isolatedDOMSource});
const isolatedDOMSink = isolateSink(sinks.DOM, scope);
return {
DOM: isolatedDOMSink
};
};
}
I could not discriminate any source of 'impurity'. Is that because the not simplified code introduces it, or because the function would return two different objects with two different references?
简化代码没有引入杂质。杂质来自于参数 scope
如果未指定则默认为 newScope()
的事实。 The actual implementation of isolate()
有:
function isolate(dataflowComponent, scope = newScope()) {
// ...
}
其中 newScope()
是:
let counter = 0
function newScope() {
return `cycle${++counter}`
}
意思是,如果 scope
没有作为参数给出,它默认为隐藏全局 counter
的下一个值,每次调用 isolate()
时都会递增。
总之,isolate(component, scope)
是引用透明的,因为我们给出了 scope
,但 isolate(component)
不是。
我有一个(相当哲学的)问题,它涉及 cyclejs
个组件:Is isolate() referentially transparent?。
查看此后复制的简化代码,我无法区分 'impurity' 的任何来源。那是因为未简化的代码引入了它,还是因为该函数将 return 具有两个不同引用的两个不同对象?
在那种情况下,这两个对象不会具有相同的行为(即监听和响应相同目标上的相同事件,并生成不同的 vTree$ 但封装完全相同的序列吗?)。如果是这样,那么这两个对象本质上不是相同的吗,即在程序中的任何地方用另一个替换另一个不应该改变任何东西吗?这意味着 isolate
是引用透明的?我哪里错了?
实际上,如果两个调用 returns 无法替代的不同对象,这些对象有何不同?
function isolate(Component, scope) {
return function IsolatedComponent(sources) {
const {isolateSource, isolateSink} = sources.DOM;
const isolatedDOMSource = isolateSource(sources.DOM, scope);
const sinks = Component({DOM: isolatedDOMSource});
const isolatedDOMSink = isolateSink(sinks.DOM, scope);
return {
DOM: isolatedDOMSink
};
};
}
I could not discriminate any source of 'impurity'. Is that because the not simplified code introduces it, or because the function would return two different objects with two different references?
简化代码没有引入杂质。杂质来自于参数 scope
如果未指定则默认为 newScope()
的事实。 The actual implementation of isolate()
有:
function isolate(dataflowComponent, scope = newScope()) {
// ...
}
其中 newScope()
是:
let counter = 0
function newScope() {
return `cycle${++counter}`
}
意思是,如果 scope
没有作为参数给出,它默认为隐藏全局 counter
的下一个值,每次调用 isolate()
时都会递增。
总之,isolate(component, scope)
是引用透明的,因为我们给出了 scope
,但 isolate(component)
不是。