無引数closureはThunk
Haskellのコードを、他の正格評価の言語で模倣する
Thunkはクロージャを使うことで表現できる
Haskellで書いた例
hsadd :: Int -> Int -> Int
add x y = x + y
main :: IO ()
main = do
let five = add (1 + 1) (1 + 2)
seven = add (1 + 2) undefined
putStrLn $ "Five: " ++ show five
seven
は使用されないので、評価されないため undefined
があってもこのコードは落ちない
TypeScriptでクロージャを使って模倣したコードを書く
全ての変数を無引数クロージャで書き直している
tstype CloNum = () => number;
const add = (x: CloNum, y: CloNum) => x() + y();
const panic = () => { throw 'Panic!'; };
const main = () => {
const five = () => add(() => 1 + 1, () => 1 + 2);
const seven = () => add(() => 1 + 2, panic);
console.log('Five: ' + five());
}
main();
seven
の引数に例外を引き起こす関数を渡しているが、このコードは落ちない
seven
は定義されているだけで、どこからも呼ばれていないので当然

Haskellではそれと同じようなことが変数の宣言レベルで起きている
>GHCでのサンクの実態は引数のないクロージャです。