Я пытался ответить на другой вопросо полиморфизме и совместном использовании, когда наткнулся на это странное поведение.
В GHCi, когда я явно определяю полиморфную константу, она не получает никакого совместного использования, что понятно:
> let fib :: Num a => [a]; fib = 1 : 1 : zipWith (+) fib (tail fib)
> fib !! 30
1346269
(5.63 secs, 604992600 bytes)
С другой стороны, если я попытаюсь добиться того же, опустив сигнатуру типа и отключив ограничение мономорфизма , моя константа внезапно становится общей!
> :set -XNoMonomorphismRestriction
> let fib = 1 : 1 : zipWith (+) fib (tail fib)
> :t fib
fib :: Num a => [a]
> fib !! 50
20365011074
(0.00 secs, 2110136 bytes)
Почему?!
Тьфу... При компиляции с оптимизацией он работает быстро даже с отключенным ограничением мономорфизма.