Это не функция;это не может быть применено - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в OCaml, и пытался создать функцию, чтобы увидеть, был ли список x подмножеством y, и я не уверен, в чем я ошибаюсь. Я читал кучу похожих проблем, и все они приводят к конфликту типов в качестве причины, но я не уверен, где у меня есть какие-либо конфликты.

# let header x = List.hd x;;
val header : 'a list -> 'a = <fun>
# let matcher x y = List.mem x y;;
val matcher : 'a -> 'a list -> bool = <fun>
# let tailer x = List.tl x;;
val header : 'a list -> 'a = <fun>
# let rec sub x y =
  if ((List.length x) == 0) then true
  else if (matcher (header x) y) then sub((tailer x) y)
  else false;;
Error: This expression has type 'a list
       This is not a function; it cannot be applied.

В rec sub xy я могулибо верните 'true' для пустого списка x, передайте sub в List.tl of x, то есть список без заголовка (насколько я понимаю), или просто верните false, если я не смог найти текущий заголовокх в у. Рекурсия должна в конечном итоге привести либо к истине, либо к ложности, поэтому я не вижу, где может возникнуть конфликт типов.

1 Ответ

0 голосов
/ 09 октября 2019

In

sub((tailer x) y)

Внешние скобки означают, что вы применяете y к результату tailer x. Сообщение об ошибке говорит вам, что это результат 'a list, а не функция. Это также означает, что вы передаете только один аргумент 'sub', результат применения y к tailer x.

Я не совсем уверен, почему вы считаете эти скобки необходимыми, но этопохоже, вы путаете его с приложением функций в стиле C, и простое удаление их устраняет ошибку.

Стоит также отметить, что из-за каррирования (tailer x) y и tailer x y эквивалентны. То есть вы имеете в виду sub (tailer x y) или sub (tailer x) y. В любом случае слишком много скобок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...