объяснение поведения функций высшего порядка и помеченного аргумента в OCaml - PullRequest
0 голосов
/ 03 ноября 2018

Принимая пример, полученный из RWOCaml:

utop # let divide ~first ~second = first / second;;
val divide : first:int -> second:int -> int = <fun>

utop # let apply_to_tuple_3 f (first,second) = f second first;;
val apply_to_tuple_3 : ('a -> 'b -> 'c) -> 'b * 'a -> 'c = <fun>

utop # apply_to_tuple_3 divide;;
Error: This expression has type first:int -> second:int -> int
       but an expression was expected of type 'a -> 'b -> 'c

Имеет ли смысл не соответствовать типам здесь? apply_to_tuple_3 использует только позиционные аргументы, которыми, безусловно, обладает divide.

После удаления имен заявка принимается

utop # let divide_an x y = divide x y;;
val divide_an : int -> int -> int = <fun>
utop # apply_to_tuple_3 divide_an;;
- : int * int -> int = <fun>

Есть ли причина отклонить первый звонок?

1 Ответ

0 голосов
/ 03 ноября 2018

Функции с помеченными параметрами имеют тип, который зависит от меток и порядка их появления. При вызове таких функций существует гибкость в порядке предоставления аргументов. И на самом деле вы можете опустить метки, если вы предоставите все аргументы.

Однако при передаче таких функций как самих значений такая гибкость отсутствует. У вас есть только один помеченный тип для работы.

Это описано на стр. 42 в Real World OCaml: Функции и метки высшего порядка .

(Если вы спрашиваете , почему это так, я могу только предположить, что проверка типов становится трудной или невозможной, если вы допускаете такую ​​гибкость.)

...