惰性求值似乎可以让函数对象的概念不再需要(以CoffeeScrpit为例就是不再需要“-\u003e”符号了),因为定义时不会求值。这个理解对吗

即使在Haskell中你也不可能不再需要“-\u0026gt;”啊。这种是最直观的惰性求值:--Haskelllet infinite = "oops" : infinitetake 3 infinite //JavaScript模拟function* infinite() { while (true) yield "oops";}var g=infinite();console.log(g.next().value);你想的那个东西其实更具体的是指Currying吧 ! Currying和惰性求值是两个不同的概念!这个是Currying:--Haskelllet add a b = a + blet add4 = add 4 -- 等同于 let add4 n = add 4 n-- 亦同于 let add4 = \ -\u0026gt; add 4 nadd4 5 //JavaScript模拟function curry(f,args) { return function () { var a=(args||).concat(.slice.call(arguments)); return a.length\u0026gt;=f.length?f.apply(this,a):curry(f,a); };}var add=curry(function (a,b,c,d) {return a+b+c+d});var add4=add(4);var add4_5=add4(5);console.log(add4_5(6,7));console.log(add(4,5,6,7));console.log(add(4)(5)(6)(7));//你记得以前你可能需要这样写的function add(a,b) {return a+b}var add4=function (b) {return add(4,b)};@赵劼 举的那个例子其实不用“-\u0026gt;”(lambda)还真能搞出来:--Lambdafilter (\\x-\u0026gt; x\u0026gt;2) --Haskell中所有函数都被视为Curriedfilter (\u0026gt;2) --不过假如函数变得复杂了的话,你还是得用lambda啊filter (\\x-\u0026gt; x\u0026gt;2 \u0026amp;\u0026amp; x\u0026lt;7) --当然这个还不够复杂,折腾点可以这样避免用lambdaimport Control.Applicativefilter ((\u0026amp;\u0026amp;) \u0026lt;$\u0026gt; (\u0026gt;2) \u0026lt;*\u0026gt; (\u0026lt;7)) 不用lambda,就是Haskell社区所吹嘘的Pointfree style:Pointfree - HaskellWiki,不习惯的话看起来有点变态。但这和惰性求值没有必然关系,一般的FP语言比如OCaml默认不是Lazy的,都支持类似这种形式的Currying、Function Composition。
■网友
函数对象是指Lambda么?这跟惰性求值没有直接联系,Lambda不(仅仅)是为了Lazy。最简单的比方就是:List.filter (fun x -\u0026gt; x \u0026gt; 2) 没有Lambda,这种怎么搞?


    推荐阅读