import ST fact n = setST xP 1 `bindST` \ _ -> setST yP n `bindST` \ _ -> (let _while = getST yP `bindST` \ y -> if y > 0 then getST xP `bindST` \ x -> getST yP `bindST` \ y -> setST xP (x*y) `bindST` \ _ -> getST yP `bindST` \ y -> setST yP (y-1) `bindST` \ _ -> _while else unitST () in _while) `bindST` \ _ -> getST xP main = print (fst (fact 9 (0, 0)))