Тип double указывает, что double является функцией от функции с доменом a и codomain a для функции с домен a и кодомен a . Тип трижды указывает, что трижды является функцией от функции с доменом a и codomain a до функции с доменом a и кодомен a .
Чтобы понять почему, рассмотрим производную типа дважды и трижды . Дана функция f : a → a и переменная x , правило для определения типа f ( fx ) утверждает, что мы должны сначала определить типы f и (fx) , а затем применить правило для применения функции. Правило для определения типа (fx) гласит, что сначала мы должны определить тип f и x , а затем применить правило для применения функции.
Во-первых, поскольку f имеет тип a → a и x имеет тип a , правило для приложения функции говорится, что ( fx ) имеет тип a . Поскольку f имеет тип a → a и ( fx ) имеет тип a , правило для применения функции утверждает, что f ( fx ) имеет тип a . Дополнительное применение правила для применения функции дает f ( f ( f x )) типа a . Как видите, повторное применение правила для приложения дает f n x будет иметь тип a для всех n ∈ ℕ.
Во-вторых, правило для абстракции функции гласит, что если x : τ , M : τ ' и x не встречается свободно в M , тогда абстракция λ x : τ . M имеет тип τ → τ '. У нас есть термины f ( fx ) и f ( f ( fx )) оба типа a и переменная x с типом a . Следовательно, абстракции λ x : a . f ( f x ) и λ x : a . f ( f ( f x )) оба имеют тип a → a . Наконец, поскольку f : a → a , применение правила для абстракции функции еще раз дает λ f : a → a . λ x : a . f ( f x ) и λ f : a → a . λ x : a . f ( f ( fx )) имеют тип ( a → a ) → ( a → a ).
Как видите, система типов Хаскелла слишком невыразительна, чтобы утверждать, что дважды применяет функцию f к аргументу x два раза, тогда как трижды применяет функцию f к аргументу x три раза. может выразить то, что дважды и трижды принимают функцию в качестве входных данных и возвращают функцию из термина x в термин y оба типа a . Эта функция является λ x : a . f ( f x ) для дважды и λ x : a . f ( f ( f x )) для трижды .
Я бы предложил прочитать краткое введение в полиморфное λ-исчисление, на котором основана система типов Хаскелла. Это представит отношение типов и, вероятно, поможет читателю доказать, что определенные термины имеют определенные типы.