Вопрос о параметрическом полиморфизме в OCaml - PullRequest
0 голосов
/ 14 декабря 2018

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

 # 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 ]

0 голосов
/ 14 декабря 2018

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

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.

0 голосов
/ 14 декабря 2018

Рассмотрим типы всех заданных переменных.Если у нас есть 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
...