Haskell Функция высшего порядка Тип - PullRequest
1 голос
/ 01 ноября 2019

Я сейчас изучаю haskell. Но я борюсь с «Типом».

  1. Например, тип функции f:

f g (x,y)= g x y

(a -> b -> c) -> (a, b) -> c

тип следующей функции Haskell h

h f g x y = f (g x y) x

(a -> b -> c) -> (b -> d -> a) -> b -> d -> c

Как понять, как угадать тип функции?

1 Ответ

4 голосов
/ 01 ноября 2019

Я проведу вас через первый: надеюсь, это даст вам достаточно идеи, чтобы вы могли выяснить второй самостоятельно.

Итак, определение функции:

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

Если бы мы заботились, мы могли бы теперь переименовать переменные типа так, чтобы это соответствовало подписи, которую вы дали - но, надеюсьВы можете видеть, что они одинаковы без необходимости делать это.

Как я уже сказал, хотя и немного более сложное, второе упражнение может быть решено с использованием точно такой же логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...