JavaScript惰性求值的一种实现方法示例

  

  

在学习Haskell时,我遇到了这种写法:

        sum (takeWhile (& lt; 10000)(过滤器奇怪(map (^ 2) [1 . .])))      

这段代码的意思是,找出自然整数中小于10000年的同时是乘方数和奇数的数字,再把这些数加总。由于Haskell的懒运算特性,上面的程序并不会立马生成从1到无限大的自然数列表,而是会等待takeWhile指令,再生成符合条件的列表。如果用JS来写,很难写出这么简洁高表达性的代码。一个可能的思路就是写个而循环,然后找到符合条件的数进行加总。这个比较简单,我就不演示了。

  

但是如果我们要用高阶函数来模拟Haskell的写法,就要想个办法实现懒运算了。提到懒,首先想到的就是迭代器。没人踢它一脚告诉它下(),它会一直坐那儿不动的。

  

  

首先定义一个生成从1到无穷大自然数的发电机:

        常量数据=函数* (){   让我=1   而(真){   产量我+ +   }   }      

由于只有在发电机执行后生成的iterable上执行next()方法,收益才会执行,所以我们要做的主要工作就是实现不同的一方法,达到目的。

  

我们需要先创建一个工厂函数懒惰,懒惰封装了我们的各种目标操作:

        const懒=迭代器=比;{   const下=iterable.next.bind (iterable)   const地图=()=比;{}   const过滤器=()=比;{}   const takeWhile=()=比;{}   返回{   接下来,   地图,   过滤器,   takeWhile,   }      

我们先实现地图方法,它会把每次下返回的值根据提供的回调函数进行修改:

        const地图=f=比;{   const modifiedNext=()=比;{   常数项=next ()   const mappedValue=https://www.yisu.com/zixun/f (item.value)   返回{   价值:mappedValue,   完成:item.done,   }   }   const newIter={…iterable,下一个:modifiedNext}   返回懒惰(newIter)   }      

再定义过滤方法,它会让下一只返回符合判断条件的值:

        const过滤谓词==比;{   const modifiedNext=()=比;{   而(真){   常数项=next ()   如果谓词(item.value)) {   返回项目   }   }   }   const newIter={…iterable,下一个:modifiedNext}   返回懒惰(newIter)   }      

最后,定义takeWhile,它会限制下执行的条件,一旦条件不满足,则停止执行下并返回历史执行结果:

        const takeWhile=谓词=比;{   const结果=[]   让价值=https://www.yisu.com/zixun/next () value   而(谓词(值)){   result.push(值)   下()value值=}   返回结果   }      

主要的方法都定义完了,现在把它们合并起来:

        const懒=iterable=比;{   const下=iterable.next.bind (iterable)      const地图=f=比;{   const modifiedNext=()=比;{   常数项=next ()   const mappedValue=https://www.yisu.com/zixun/f (item.value)   返回{   价值:mappedValue,   完成:item.done,   }   }   const newIter={…iterable,下一个:modifiedNext}   返回懒惰(newIter)   }      const过滤谓词==> {   const modifiedNext=()=> {   而(真){   常数项=next ()   如果谓词(item.value)) {   返回项目   }   }   }   const newIter={…iterable,下一个:modifiedNext}   返回懒惰(newIter)   }      谓词const takeWhile==> {   const结果=[]   让价值下()value=而(谓词(值)){   result.push(值)   下()value值=}   返回结果   }      返回Object.freeze ({   地图,   过滤器,   takeWhile,   接下来,   })   }      常量数据=函数* (){   让我=1   而(真){   产量我+ +   }   }      

现在用我们写的懒惰和数字函数来实现文章开头的Haskell代码:

        懒惰(数字())   . map (x=比;x * * 2)   .filter (x=比;x % 2===1)   .takeWhile (x=比;x & lt;10000)   .reduce (x, y)=比;x + y)//=比;16650年      

<强>参考:

  

懒惰的评价与发电机在JavaScript中,地图,过滤器,并减少

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

JavaScript惰性求值的一种实现方法示例