Оставьте первые n элементов в списке - PullRequest
4 голосов
/ 19 октября 2010

Я пытаюсь создать функцию, которая отбрасывает первые n элементов списка:

let rec drop n h =
   if n == 0 then h else (drop n-1 (match h with a::b -> b));;

Это дает:

Characters 43-49:
   if n == 0 then h else (drop n-1 (match h with a::b -> b));;
                          ^^^^^^
Error: This expression has type 'a -> 'b but is here used with type int

Что здесь не так? Это мой первый день в OCAML (с функциональным программированием в целом), я просто следую инструкциям и учебникам в Интернете. Я понятия не имею, что означает это сообщение.

Кроме того, это часть более крупного домашнего задания, которое не требует использования Let, кроме определений функций, и не требует дополнительных библиотек

Ответы [ 2 ]

8 голосов
/ 19 октября 2010

Для компилятора ваш else случай выглядит следующим образом:

((drop n)-1 (match h with a::b -> b))

Сообщение об ошибке означает, что (drop n) - это функция, и вы пытаетесь использовать ее как int (вычитаниеодин из них).

Вы имели в виду:

(drop (n-1) (match h with a::b -> b))

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

6 голосов
/ 19 октября 2010

drop n-1 анализируется как (drop n) - 1, вы хотите drop (n-1).

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