Я щойно закінчив учінняааскелл на днях, і я намагався зрозуміти обмеження мономорфізму, як описано в Haskell Wiki . Я думаю, що я розумію, як ЗМ може запобігти повторному оцінюванню, але я не розумію, чому цих повторних оцінок неможливо уникнути набагато більш простими способами.
Я маю на увазі конкретний приклад, який використовується вікі:
f xs = (len,len)
where
len = genericLength xs
де genericLength
є тип Num a => [b] -> a
.
Очевидно, що genericLength xs
для їх оцінки потрібно обчислити лише один раз (len,len)
, оскільки це та сама функція з тими ж аргументами. І нам не потрібно бачити жодних викликів, f
щоб це знати. То чому б Haskell не може зробити цю оптимізацію, не запровадивши таке правило, як MR?
Обговорення на цій сторінці вікі говорить про те, що це має щось Num
спільне з тим, що це тип класу, а не конкретний тип, але навіть якщо це не стане очевидним під час компіляції, що чиста функція повертає те саме значення, -і, отже, той самий конкретний тип Num - коли даються однакові аргументи двічі?
f [] :: (Int, Float)
. Тепер це має ідеальний сенс. Дякую.