2016-02-18 1 views
1

У меня есть очень интересный первый проект, чтобы узнать OCaml, после создания Personnal list типа, как, например:Тип ошибки на функцию длины

type 'a my_list = Item of ('a * 'a my_list) | Empty;; 

И наполняя его, как, например:

let num_list = Item (1, Item (2, Item(3, Empty)));; 

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

Я начинаю с Length, который звучит как самый простой и хороший для начала.

Вот что я до сих пор:

let rec length my_list = 
match my_list with 
| [] -> 0 
| head::rest -> 1 + (length rest);; 

, которая имеет право определение:

val length : 'a list -> int = <fun> 

Но когда я прохожу свой вновь созданный список, я получаю следующее сообщение об ошибке:

Error: This expression has type int my_list but an expression was expected of type 'a list

Что я упускаю?

Я до сих пор наслаждаюсь OCaml и очень ценю вашу помощь.

ответ

2

Вы фактически не используете свой собственный 'a my_list тип, но оригинал 'a list.

Ваша функция должна сделать сопоставление с образцом, а не на 'a list, но на 'a my_list:

let rec my_length my_list = 
    match my_list with 
    | Empty -> 0 
    | Item (_, rest) -> 1 + (my_length rest);; 

типа, что вы получаете сейчас:

val my_length : 'a my_list -> int = <fun> 

Теперь вы используете свой собственный 'a my_list type.

+0

О, я вижу! Большое вам спасибо за вашу помощь, это поможет мне для других функций. –

Смежные вопросы