Спасибо всем, кто ответил на мой вопрос. Я изучил ваши ответы. Чтобы быть уверенным, что я понимаю, что я узнал, я написал свой собственный ответ на мой вопрос. Если мой ответ неправильный, пожалуйста, дайте мне знать.
Мы начнем с типами k
и s
: первая работа
k :: t1 -> t2 -> t1
k = (\a x -> a)
s :: (t3 -> t4 -> t5) -> (t3 -> t4) -> t3 -> t5
s = (\f g x -> f x (g x))
Давайте на определивших тип подписи (s k)
.
Напомним s
's определение:
s = (\f g x -> f x (g x))
Подставив k
для f
результатов в (\f g x -> f x (g x))
контрактов на:
(\g x -> k x (g x))
Важно тип г и х должны быть согласованы с k
-х типа.
Напомним, что k
имеет этот тип подписи:
k :: t1 -> t2 -> t1
Таким образом, для этой функции определения k x (g x)
мы можем сделать вывод:
Тип x
тип первого аргумента k
«s , который является типом t1
.
Тип k
«ы второго аргумента t2
, поэтому результат должен быть (g x)
t2
.
g
имеет x
, поскольку его аргумент, который мы уже определили, имеет тип t1
. Таким образом, подпись типа (g x)
- (t1 -> t2)
.
Тип результата k
«ы является t1
, поэтому результат (s k)
является t1
.
Таким образом, тип подписи (\g x -> k x (g x))
это:
(t1 -> t2) -> t1 -> t1
Далее k
определяется всегда возвращает свой первый аргумент.Так что это:
k x (g x)
контракты на это:
x
И это:
(\g x -> k x (g x))
контракты на это:
(\g x -> x)
Хорошо, теперь мы выяснили (s k)
:
s k :: (t1 -> t2) -> t1 -> t1
s k = (\g x -> x)
Теперь давайте определим подпись типа s (s k)
.
Мы действуем аналогичным образом.
Напомним s
's определение:
s = (\f g x -> f x (g x))
Подставив (s k)
для f
результатов в (\f g x -> f x (g x))
контрактов на:
(\g x -> (s k) x (g x))
Важно Тип g
и x
должны соответствовать (s k)
-х типа.
Напомним, что (s k)
имеет этот тип подписи:
s k :: (t1 -> t2) -> t1 -> t1
Таким образом, для этой функции определения (s k) x (g x)
мы можем сделать вывод:
Тип x
тип первого аргумента (s k)
«s , который является типом (t1 -> t2)
.
Тип (s k)
«ы второго аргумента t1
, поэтому результат должен быть (g x)
t1
.
g
имеет x
, поскольку его аргумент, который мы уже определили, имеет тип (t1 -> t2)
. Таким образом, подпись типа (g x)
- ((t1 -> t2) -> t1)
.
Тип результата (s k)
«ы является t1
, поэтому результат s (s k)
является t1
.
Таким образом, тип подписи (\g x -> (s k) x (g x))
это:
((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
Ранее мы определили, что s k
имеет такое определение:
(\g x -> x)
То есть, это функция, которая принимает два аргументы и возвращает вторую.
Таким образом, это:
(s k) x (g x)
контракты на это:
(g x)
И это:
(\g x -> (s k) x (g x))
контракты на это:
(\g x -> g x)
Хорошо, теперь мы выяснили s (s k)
.
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
s (s k) = (\g x -> g x)
Наконец, сравните тип подписи s (s k)
с сигнатурой типа этой функции:
p = (\g x -> g x)
Тип p
является:
p :: (t1 -> t) -> t1 -> t
p
и s (s k)
имеют такое же определение (\g x -> g x)
, так почему у них есть разные подписи?
Причина, по которой s (s k)
имеет подпись другого типа, чем p
, заключается в том, что нет ограничений на p
. Мы видели, что s
в (s k)
ограничен согласованием с типом сигнатуры k
, а первое s
в s (s k)
ограничено, чтобы соответствовать сигнатуре типа (s k)
. Таким образом, подпись типа s (s k)
ограничена из-за его аргумента. Хотя p
и s (s k)
имеют то же определение, ограничения на g
и x
отличаются.
Последний тип такой же, как и первый, только более строгий. Существуют ли ограничения на 'X' и' Y'? – fuz