2015-10-09 2 views
1

Я изучаю OCaml прямо сейчас, и после того, как я это делаю,OCaml ошибка: "тип вариант не имеет конструктора ::"

type aexp = 
| Const of int 
| Var of string 
| Power of string * int 
| Times of aexp list 
| Sum of aexp list 

let rec diff : aexp * string -> aexp 
=fun (aexp,x) -> match aexp with 
|Const a -> Const 0 
|Var "x" -> Const 1 
|Power ("x", a) -> (match a with 
|2 -> Times[Const 2; Var "x"] 
|1 -> Const 1 
|0 -> Const 0 
|_ -> Times[Const a; Power ("x", a-1)]) 
|Times [l] -> (match l with 
|h::t -> (match t with 
    |Var "x" -> h 
    |Power ("x",a) -> Times [Times [h;Const a];diff(Power ("x",a),x)])) 

Я получаю сообщение об ошибке:

File "", line 11, characters 3-5:

Error: The variant type aexp has no constructor ::

I узнал, что :: является конкатенацией одного элемента в список или другой элемент списка.

Он работал с другими моими кодами, которые использовали список.

Почему здесь не работает?

ответ

0

Ваш шаблон Times [l] соответствует узлу Times с точно одним элементом с именем l. Вы хотели написать Times l, который соответствует узлу Times со списком любого количества элементов, привязанным к l в теле предложения.

Обратите внимание, что в OCaml вы можете использовать вложенный поиск по шаблону, например:

| Times (Var "x" :: _) -> h 
| Times (Power ("x",a) :: _) -> ... 
| ... 
+0

Привет, ТНХ для ответа. Он решил сообщить об ошибке, но теперь появляются другие сообщения об ошибках. Я попрошу еще раз в другом вопросе. –

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