Javascript 在函数式编程中,为什么选择IO';s join方法应该运行unsafePerformIO两次吗?
,有几个例子可以解释monad,例如:Javascript 在函数式编程中,为什么选择IO';s join方法应该运行unsafePerformIO两次吗?,javascript,functional-programming,monads,Javascript,Functional Programming,Monads,,有几个例子可以解释monad,例如: Maybe.prototype.join = function() { return this.isNothing() ? Maybe.of(null) : this.__value; } 至于IO: IO.prototype.join = function() { var thiz = this; return new IO(function() { return thiz.unsafePerformIO().unsafePerfo
Maybe.prototype.join = function() {
return this.isNothing() ? Maybe.of(null) : this.__value;
}
至于IO:
IO.prototype.join = function() {
var thiz = this;
return new IO(function() {
return thiz.unsafePerformIO().unsafePerformIO();
});
};
我想知道为什么IO应该运行两次unsafePerformIO来返回一个新IO,而不是只返回这个。unsafePerformIO()?除非我这么说,否则不要执行IO 在IO的情况下,重要的是在需要之前不要执行任何IO–在下面的示例中,请特别注意输出行的顺序
//IO
常数IO=函数(f){
此.unsafePerformIO=f
}
IO.of=功能(x){
返回新IO(()=>x)
}
IO.prototype.join=函数(){
返回此文件。unsafePerformIO()
}
//你的主要节目
常量main=函数(m){
console.log('您不应该看到此行上方的任何内容')
log('程序结果为',m.unsafePerformIO())
}
//IO(IO(某物))
常量m=新IO(()=>{
console.log('加入…')
返回IO.of(5)
})
//运行它
main(m.join())
除非我这么说,否则不要输入IO
在IO的情况下,重要的是在需要之前不要执行任何IO–在下面的示例中,请特别注意输出行的顺序
//IO
常数IO=函数(f){
此.unsafePerformIO=f
}
IO.of=功能(x){
返回新IO(()=>x)
}
IO.prototype.join=函数(){
返回此文件。unsafePerformIO()
}
//你的主要节目
常量main=函数(m){
console.log('您不应该看到此行上方的任何内容')
log('程序结果为',m.unsafePerformIO())
}
//IO(IO(某物))
常量m=新IO(()=>{
console.log('加入…')
返回IO.of(5)
})
//运行它
main(m.join())
说明在文档中,复制粘贴文档对您没有帮助。这是因为它们有嵌套的IO
对象,所以您必须“剥离”层。也许你还不了解代码的其他部分,这让你不清楚?是的,这是违反直觉的。应用join
时,它不执行join操作,只添加另一个单元上下文,即另一个thunk。连接操作本身是延迟的。换句话说,join
首先执行与预期相反的操作,并延迟实际的连接操作,直到实际执行不纯计算join
然后必须处理它自己添加的上下文。你知道IO.prototype.map
是如何工作的吗?解释在文档中,复制粘贴文档在这里对你没有帮助。这是因为它们有嵌套的IO
对象,所以您必须“剥离”层。也许你还不了解代码的其他部分,这让你不清楚?是的,这是违反直觉的。应用join
时,它不执行join操作,只添加另一个单元上下文,即另一个thunk。连接操作本身是延迟的。换句话说,join
首先执行与预期相反的操作,并延迟实际的连接操作,直到实际执行不纯计算join
然后必须处理它自己添加的上下文。你知道IO.prototype.map
是如何工作的吗?当你的代码中确实有bug时,你认为返回可能(未定义)
有用吗join
必须返回monad,否则它应该抛出或返回undefined
。我还不确定可能(未定义)
的语义是什么。@ftor,不是特别有用,不是–但这就是JS的类型系统崩溃的地方。我添加了一些关于弱类型JS的内容,以及join
的可能(某种)幂等实现。我很好奇你的想法。@ftor,我同意你的看法:扔/抓。我认为宽容的解决方案无助于构建语义正确的程序。也就是说,加入一个非嵌套单子的能力似乎是一个不好的限制。毒药?不,让我们选择PureScript@贝基,你是粉丝吗?到目前为止,我只是在学习和享受它。我还没有用它写任何非常有意义的东西,但是当你的代码中确实有一个bug时,你认为返回一个可能(未定义)
是否有用join
必须返回monad,否则它应该抛出或返回undefined
。我还不确定可能(未定义)
的语义是什么。@ftor,不是特别有用,不是–但这就是JS的类型系统崩溃的地方。我添加了一些关于弱类型JS的内容,以及join
的可能(某种)幂等实现。我很好奇你的想法。@ftor,我同意你的看法:扔/抓。我认为宽容的解决方案无助于构建语义正确的程序。也就是说,加入一个非嵌套单子的能力似乎是一个不好的限制。毒药?不,让我们选择PureScript@贝基,你是粉丝吗?到目前为止,我只是在学习和享受它。我还没有用它写任何有意义的东西^_^