Я проведу вас через первый: надеюсь, это даст вам достаточно идеи, чтобы вы могли выяснить второй самостоятельно.
Итак, определение функции:
f g (x,y)= g x y
f
- это интересующая нас функция, и мы можем видеть из вышесказанного - фактически с левой стороны - что она принимает 2 аргумента: g
и кортеж (x,y)
. Итак, давайте используем некоторые переменные типа:
- мы будем использовать
a
для типа g
b
для типа x
c
для типа y
- и
d
для типа, который f
выводит при наличии двух аргументов.
Это дает нам
f :: a -> (b, c) -> d
и далее это все информация, которую мы можем получить слева от =
. Мы можем узнать больше, взглянув на правую сторону - g x y
, который должен иметь тип d
.
Ну и само выражение g x y
говорит нам, что g
- это функция, которая может принимать2 аргумента. Кроме того, мы уже присвоили типы этим аргументам - и их возвращаемому значению (поскольку это то же значение, которое выводит f g (x,y)
, который, как мы уже говорили, имеет тип d
).
Запись всего этогомы находим, что тип g
просто b -> c -> d
. Подставляя это в тип f
, который мы записали выше, мы получим:
f :: (b -> c -> d) -> (b, c) -> d
Если бы мы заботились, мы могли бы теперь переименовать переменные типа так, чтобы это соответствовало подписи, которую вы дали - но, надеюсьВы можете видеть, что они одинаковы без необходимости делать это.
Как я уже сказал, хотя и немного более сложное, второе упражнение может быть решено с использованием точно такой же логики.