NoMonomorphismRestriction помогает сохранить общий доступ?

Я пытался ответить на другой вопросо полиморфизме и совместном использовании, когда наткнулся на это странное поведение.

В 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)

Почему?!

Тьфу... При компиляции с оптимизацией он работает быстро даже с отключенным ограничением мономорфизма.

10
задан Community 23 May 2017 в 11:51
поделиться