Начните с того, что вы знаете, затем немного разберитесь здесь и немного там, пока не останется неизвестных.
Вот одна из возможностей:
Вызовите неизвестные типы FOO
,F
, G
, X
и Y
соответственно.
Затем найдите что-то маленькое и простое и начните присваивать типы.
(g x)
- это, безусловно, приложениефункции с одним аргументом.
Установите X
= a
и G
= a -> b
.
Затем посмотрите на включающее выражение:
(f x (g x) y)
| |
v v
a b
Такдалеко, мы знаем, что F
= a -> b -> Y -> C
, для некоторых C
.
снова выйдем наружу:
f (f x (g x) y) y
, так как оба x
и (f x (g x) y)
являются первыми аргументамиf
, они должны быть одного типа a
, и та же идея применима к y
и (g x)
, давая им тип b
.
Итак, F
= a -> b -> b -> a
и, поскольку внешнему f
дается только два аргумента, тип правой части должен быть b -> a
.
Таким образом
X = a
Y = b
G = a -> b
F = a -> b -> b -> a
FOO = (a -> b -> b -> a) -> (a -> b) -> a -> b -> (b -> a)
И, так как стрелкиассоциировать справа FOO
эквивалентно
(a -> b -> b -> a) -> (a -> b) -> a -> b -> b -> a