x = x-1

はHaskellだと止まらないよ。

x = x-1 = (x-1)-1 = ((x-1)-1)-1) = ...

といつまでたっても書き換えが終わらないから。
ただこの例ではループの検出が容易なのでghciで

ghci> let x = x-1
ghci> x

を試すと *** Exception: <<loop>> となって中断される。
基底部のない再帰はそうならない。