サンク メモ

Haskellで書いてもしょうがないのであとでF#にするか? 正格評価の言語だとunitがアウトだなきっと。最初から() -> a で渡してやらないと。

newtype Thunk a =  T (() -> a)
unit            :: a -> Thunk a
unit x          =  T (\y -> x)
eval            :: Thunk a -> a
eval (T x)      =  x ()
apply           :: (Thunk (Thunk a -> b)) -> Thunk a -> Thunk b
apply f x       =  unit (eval f x)

 1
two = unit 2
add = unit (\x -> \y -> eval x + eval y)
three = add `apply` one `apply` two