Вопрос о параметрическом полиморфизме в 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
,