Ваша функция n
имеет тип int -> int -> 'a option list -> 'a option
, потому что в первом случае
| [] -> None
вы возвращаете None
, то есть значение типа 'a option
, а во втором случае
|t::q when (v - size q) = k -> t
вы возвращаете элемент списка.Поскольку функция может иметь только один тип возвращаемого значения, алгоритм вывода типа объединяет тип элементов списка с типом параметра, таким образом требуя, чтобы элементы списка ввода имели тип 'a option
Функция print_int
принимаетзначения типа int
, но вы передаете что-то, что 'a option
, а не int.Более того, если вы удалите print_int
, то следующее выражение также не будет набирать:
let _ = n 3 5 [1;2;3;4;5]
, потому что ваша функция n
принимает список опций, а не список целых чисел, например,
let _ = n 3 4 [Some 1; Some 2; None; None]