Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数式编程中,为什么选择IO';s join方法应该运行unsafePerformIO两次吗?_Javascript_Functional Programming_Monads - Fatal编程技术网

Javascript 在函数式编程中,为什么选择IO';s join方法应该运行unsafePerformIO两次吗?

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

,有几个例子可以解释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().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@贝基,你是粉丝吗?到目前为止,我只是在学习和享受它。我还没有用它写任何有意义的东西^_^