Я пытался ответить на еще один вопрос о полиморфизме против совместного использования, когда я наткнулся на это странное поведение.
В 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)
Почему?
Ugh... Когда скомпилирован с оптимизацией, он быстр даже с ограничением мономорфизма.