Да предположим, че функция g
е дефинирана по следния начин.
utop # let g ~y ~x = x + y ;;
val g : y:int -> x:int -> int = <fun>
utop # g ~x:1 ;;
- : y:int -> int = <fun>
utop # g ~y:2 ;;
- : x:int -> int = <fun>
utop # g ~x:1 ~y:2 ;;
- : int = 3
utop # g ~y:2 ~x:1 ;;
- : int = 3
Сега има друга функция foo
utop # let foobar (f: x:int -> y:int -> int) = f ~x:1 ~y:2 ;;
val foobar : (x:int -> y:int -> int) -> int = <fun>
За съжаление, когато се опитам да осигуря g
като параметър на foobar
, той се оплаква:
utop # foobar g ;;
Error: This expression has type y:int -> x:int -> int
but an expression was expected of type x:int -> y:int -> int
Това е доста изненадващо, тъй като мога успешно да currify g
, но не мога да го предам като параметър. Търсих в Google и намерих тази статия, която не помага много. Предполагам, че това е свързано с основната система от типове на OCaml (напр. правила за подтипиране на обозначени типове стрелки).
Така че възможно ли е да се предаде g
като параметър на foobar
по какъвто и да е начин в OCaml? Ако не, защо не е позволено? Всякакви спомагателни статии/книги/статии биха били достатъчни.