Когда я впервые узнал Haskell, я очень быстро полюбил параметрический полиморфизм. Это восхитительно простая идея, которая работает удивительно хорошо. Целый "если он компилирует его, как правило, работает правильно", в основном из-за параметрического полиморфизма, ИМХО.
Но на днях мне что-то пришло в голову. Я могу написать foo
как полиморфную функцию. Но когда bar
вызывает foo
, он будет делать это с помощью определенного набора типов аргументов. Или, если bar
сам является полиморфным, то его вызывающий назначает определенные типы. По индукции кажется, что если вы должны принять любую действительную программу Haskell и проанализировать всю кодовую базу, вы можете статически определять тип каждой отдельной вещи во всей программе.
Это, в некотором смысле, немного похоже на шаблоны С++. Полиморфизм во время выполнения не существует, а только полиморфизм времени компиляции. Компилятор Haskell мог бы генерировать отдельный машинный код для каждого типа, в котором вызывается каждая полиморфная функция. Большинство компиляторов Haskell этого не делают, но вы можете реализовать его, если хотите.
Только если вы начнете добавлять расширения Haskell (ExistentialQuantification
является очевидным), вы начинаете получать реальный полиморфизм во время выполнения, где у вас есть значения, тип которых не может быть статически вычислен.
О, да, мой вопрос?
-
Правильны ли правильные выражения?
-
Существует ли широко используемое имя для этого свойства?