import ST fact n = setXST 1 `bindST` \ _ -> setYST n `bindST` \ _ -> (let _while = getYST () `bindST` \ y -> if y > 0 then getXST () `bindST` \ x -> getYST () `bindST` \ y -> setXST (x*y) `bindST` \ _ -> getYST () `bindST` \ y -> setYST (y-1) `bindST` \ _ -> _while else unitST () in _while) `bindST` \ _ -> getXST () main = print (fst (fact 9 (0, 0)))