6

Haskell では、ラムダは WHNF にあると見なされますが、適用されていないユーザー定義関数はそうではありません。この違いの背後にある動機は何でしたか?

4

1 に答える 1

9

関数を評価する前に計算する必要があるが、後で呼び出し間で共有できる情報を関数に添付すると便利なことがよくあります。

cleverFunction = \x -> simpleCombine x expensiveConstant
 where expensiveConstant = ...
       simpleCombine x c = ...

はラムダとして定義されていますが、ブロック (sugar for )cleverFunctionのため、WHNF には含まれていないことに注意してください。where(\l x -> ...) locBindings

囲んでいるスコープのないラムダには、呼び出し前に計算できる変数がありません (ラムダの変数単一の呼び出しに対してのみ有効で、後でガベージ コレクションされます)、つまり、既に通常の形式になっています (実際には WHNF だけでなく NF)。 .

于 2014-08-31T20:56:27.800 に答える