Let-полиморфизм

Полиморфизм

Система типов по Карри обеспечивает полиморфизм, в том смысле, что терм может иметь различные типы. Необходимо различать концепции полиморфизма и перегрузки. Оба этих термина означают, что выражение может иметь несколько типов. Однако в случае полиморфизма все типы сохраняют струкурное сходство. Например, функция идентичности может иметь тип σ —> σ, τ —> τ или (σ —> τ)—> (σ —> τ). При перегрузке функция может иметь различные типы, не связанные друг с другом структурным сходством.

Рассмотренная система типов приводит к некоторым ограничениям на полиморфизм. Например, приемлемо следующее выражение:

if (λx. x) true then (λx.x) 1else 0

Если использовать правила типизации, то можно получить, что это выражение имеет тип int. Два экземпляра функции идентичности имеют типы bool —>bool и int —> int соответственно.

Рассмотрим выражение:

let I = λx. x in if I true then I 1 else 0

Согласно определению, это иной способ записи для

(λI. if I true then I 1 else 0) (λx. x)

Однако это выражение не может быть типизировано. В нем присутствует единственный экземпляр функции идентичности, и он должен иметь единственный тип.

Для преодоления этого ограничения добавим правило типизации, в котором let-конструкции рассматривается как первичная:

Это правило определяет let-полиморфизм.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: