無引数closureはThunk
Haskellのコードを、他の正格評価の言語で模倣する
Thunkはクロージャを使うことで表現できる
Haskellで書いた例
code:hs
add :: 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でクロージャを使って模倣したコードを書く
全ての変数を無引数クロージャで書き直している
code:ts
type 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は定義されているだけで、どこからも呼ばれていないので当然mrsekut.icon
Haskellではそれと同じようなことが変数の宣言レベルで起きている
GHCでのサンクの実態は引数のないクロージャです。