generated at
無引数closureはThunk


正格評価の言語で遅延評価をする
Haskellのコードを、他の正格評価の言語で模倣する
Thunkを表現できればいい
Thunkはクロージャを使うことで表現できる

Haskellで書いた例
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でクロージャを使って模倣したコードを書く
全ての変数を無引数クロージャで書き直している
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
Haskellではそれと同じようなことが変数の宣言レベルで起きている
ここのコードを改変




>GHCでのサンクの実態は引数のないクロージャです。