Ответ на ваш вопрос действительно есть в басне Рейнольдса (Раздел 1). Позвольте мне попытаться истолковать это для вас.
В языке или формализме, в которых типы рассматриваются как абстракции , переменная типа может обозначать любую абстрактную концепцию. Мы не предполагаем, что типы генерируются с помощью некоторого синтаксиса терминов типа, или некоторого фиксированного набора операторов типа, или что мы можем проверять два типа на равенство и т. Д. В таком языке, если функция включает переменную типа, тогда единственным что функция может сделать со значениями этого типа, так это перетасовать значения, которые ей были заданы. Он не может придумать новые значения этого типа, потому что он не «знает», что это за тип! Это интуитивная идея параметричности .
Затем Рейнольдс подумал о том, как математически уловить эту интуитивную идею, и заметил следующий принцип. Предположим, что мы создаем экземпляр переменной типа, скажем, , для двух разных конкретных типов, скажем, A и A ′ , в отдельных случаях и помним некоторое соответствие R : A ↔ A ′ между двумя конкретными типами. Тогда мы можем представить, что в одном случае мы предоставляем значение x ∈ A для функции, а в другом случае соответствующее значение x ′ ∈ A ′ (где «соответствующий» означает, что x иtAA′R:A↔A′x∈Ax′∈A′x связаны с R ). Затем, поскольку функция ничего не знает о типах, которые мы предоставляем для t или значениях этого типа, она должна обрабатывать x и x ' точно так же. Таким образом, результаты, которые мы получаем из функции, должны снова соответствовать соотношению R, которое мы запомнили, т. Е. Везде, где элемент x появляется в результате одного экземпляра, элемент x ′ должен появляться в другом экземпляре. Таким образом,параметрически полиморфная функция должна сохранять все возможные реляционные соответствия между возможными экземплярами переменных типа.x′Rtxx′Rxx′
Эта идея сохранения соответствий не нова. Математики знали об этом давно. Во-первых, они думали, что полиморфные функции должны сохранять изоморфизмы между экземплярами типов. Обратите внимание, что изоморфизм означает некоторую идею взаимно-однозначного соответствия . По-видимому, изоморфизмы первоначально назывались «гомоморфизмами». Затем они поняли, что то, что мы сейчас называем «гомоморфизмами», т. Е. Некоторое представление о соотношениях « многие к одному» , также будет сохранено. Такое сохранение носит название естественной трансформации в теории категорий. Но, если мы думаем об этом остро, мы понимаем, что сохранение гомоморфизмов совершенно неудовлетворительно. Типы и A ′AA′мы упомянули совершенно произвольно. Если мы выберем качестве A ′ и A ′ в качестве A , мы должны получить то же свойство. Итак, почему «соответствие многим к одному», асимметричное понятие, должно играть роль в формулировании симметричного свойства? Таким образом, Рейнольдс сделал большой шаг в обобщении от гомоморфизмов к логическим отношениям, которые представляют собой соответствия « многие ко многим» . Полное влияние этого обобщения еще не полностью понято. Но основная интуиция довольно ясна.AA′A′A
Здесь есть еще одна тонкость. В то время как экземпляры переменных типов могут произвольно варьироваться, константные типы должны оставаться фиксированными. Таким образом, когда мы формулируем реляционную корреспонденцию для выражения типа с обоими типами переменных и постоянных типов, мы должны использовать выбранное соотношение везде , где появляется переменная типа и тождественное соотношение I K везде , где константа типа K появляется. Например, выражение отношения для типа t × I n t → I n t × t будет иметь вид R × I I n t → I IRIKKt×Int→Int×t. Таким образом, еслиfявляется функцией этого типа, она должна отобразить пару(x,n)и связанный( x ′ ,n)с некоторой парой(m,x)и связанным(m, x ′ )R×IInt→IInt×Rf(x,n)(x′,n)(m,x)(m,x′), Обратите внимание, что мы обязаны проверить функцию, поместив одинаковые значения для константных типов в обоих случаях, и мы гарантированно получим одинаковые значения для константных типов в выходных данных. Таким образом, при формулировании реляционных соответствий для выражений типов мы должны убедиться, что, подключив идентичные отношения (представляющие идею, что эти типы будут согласованными), мы получим обратно идентичные отношения, то есть . Это важнейшее расширение личностиF(IA1,…,IAn)=IF(A1,…,An) свойство.
Чтобы понять параметричность интуитивно, все, что вам нужно сделать, - это выбрать некоторые типы функций семплов, подумать о том, какие функции могут быть выражены для этих типов, и подумать о том, как эти функции ведут себя, если вы подключаете различные экземпляры переменных типа и разные значения этих функций. типы экземпляров. Позвольте мне предложить несколько типов функций для начала работы: , t → I n t , I n t → t , t × t → t × t , ( t → t ) → t , ( tt→tt→IntInt→tt×t→t×t(t→t)→t .(t→t)→(t→t)