Вопрос о параметрическом полиморфизме в OCaml

Эта полиморфная функция позволяет нам изменять порядок аргументов произвольной функции с карри:

 # let flip f x y = f y x ;;
   val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c

То есть flip принимает функцию типа 'a ->' b -> 'c и возвращает функцию типа b -> 'a -> 'c. Но я на самом деле не понимаю, почему это правильно? как определяется порядок a, b, c? Довольно запутался, может кто-нибудь объяснить мне, спасибо.

2 ответа

Давайте рассмотрим типы всех данных переменных. Если у нас есть f : 'a -> 'b -> 'cпотом из кода f y x в определении функции мы имеем y : 'a а также x : 'b, Также тип возврата flip (т.е. тип flip f x y) это тип f y x, так 'c,

Функция flip имеет три параметра, f, x, а также y в этом порядке. И это возвращает значение f y x, Поэтому тип flip является:

flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c
       ----------------    --    --    --
         |                  |     |     |_ The type of the return value, (f y x)
         |                  |     |_ The type of y
         |                  |_ The type of x
         |_ The type of f

Возможно, это может помочь вам. Вместо,

let flip f x y = f y x ;;

написать эквивалентное определение,

let flip f = fun x y -> f y x;;

теперь посмотрим на тип,

val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c

это так же, как это, с круглыми скобками,

val flip : ('a -> 'b -> 'c) -> ('b -> 'a -> 'c)

функция flip берет на себя функцию f типа 'a -> 'b -> 'c и возвращает функцию \fun x y -> f y x типа 'b -> 'a -> 'c,

Другие вопросы по тегам