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