Статические типы, полиморфизм и специализация

Когда я впервые изучил Haskell, я очень быстро полюбил параметрический полиморфизм. Это восхитительно простая идея, которая работает удивительно хорошо. Вся эта фраза «если он компилируется, он обычно работает правильно» в основном связана с параметрическим полиморфизмом, ИМХО.

Но на днях кое-что пришло мне в голову. Я могу написать fooкак полиморфную функцию. Но когда barвызывает foo, он будет делать это с определенным набором типов аргументов. Или, если barсам по себе является полиморфным, то его вызывающий объект будет назначать определенные типы. По индукции кажется, что если вы возьмете любую действующую программу на Haskell и проанализируете всю кодовую базу, вы сможете статически определить тип каждой отдельной вещи во всей программе.

В некотором смысле это немного похоже на шаблоны C++.Нет полиморфизма времени выполнения, есть только полиморфизм времени компиляции. Компилятор Haskell может генерировать отдельный машинный код для каждого типа, для которого вызывается каждая полиморфная функция. Большинство компиляторов Haskell этого не делают, но вы можете реализовать их, если захотите.

Только если вы начнете добавлять расширения Haskell (очевидным является ExistentialQuantification), вы начнете получать настоящий полиморфизм во время выполнения, когда у вас есть значения, тип которых не может быть вычислен статически. .

О, да, мой вопрос?

  1. Верны ли приведенные выше утверждения?

  2. Существует ли широко используемое имядля этого свойства?

29
задан Don Stewart 10 May 2012 в 20:27
поделиться