Ошибка: это выражение имеет тип int, но ожидалось выражение типа 'опция - PullRequest
0 голосов
/ 12 июня 2018

Вот мой код:

let rec size = function 
    | [] -> 0
    | t::q -> 1 + size q

let rec n k v lst = match lst with 
    | [] -> None 
    | t::q when (v - size q) = k -> t
    | _::q -> n k v q

let () = print_int (n (3) (5) ([ 1 ; 2; 3; 4; 5 ]) )

Он говорит следующее:

File "main.ml", line 10, characters 33-34:
Error: This expression has type int but an expression was expected of type
         'a option

Я не понимаю, что это значит.Я пытаюсь напечатать n-й элемент списка.Я имею в виду print_int ждет int и k, v являются целыми числами.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Ваша функция 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]
0 голосов
/ 12 июня 2018

Первый случай вашей функции n возвращает None, тип которой 'a option.Затем вы продолжаете возвращать t, поэтому компилятор выводит t также должен иметь тип 'a option.

. Вы должны использовать конструктор Some при возврате t:

let rec n k v lst = match lst with 
  |[] -> None 
  |t::q when (v - size q) = k -> Some t
  |_::q -> n k v q

Однако вы не сможете сразу использовать его с print_int, вам придется распаковать тип option следующим образом:

let () = match (n (3) (5) ([ 1 ; 2; 3; 4; 5 ]) ) with
  | Some v -> print_int v
  | None -> ()
...