Поскольку ваш код эквивалентен
consume store (x:xs) = putMVar store >> consume store xs
вызов на самом деле не происходит в хвостовой позиции. Но если вы запустите ghc -O
и включите оптимизатор, опция -ddump-simpl
покажет вам вывод промежуточного кода GHC, и он действительно оптимизируется в хвостовую рекурсивную функцию, которая скомпилируется в цикл.
Так что ответ GHC не оптимизирует это по умолчанию; вам нужна опция -O
.
(Эксперименты выполнены с GHC версии 6.10.1.)