OCaml типы не совместимы - OCamlyacc

  funcexpr:  /* This is a function: arguments -> string list */
   LPAREN HEAD arguments RPAREN                     { let head a = [List.hd (List.hd a)] in head << $3 }
 | LPAREN REAR arguments RPAREN                     { let rear b = List.tl (List.hd b) in rear << $3 }
 | LPAREN ERECT arguments RPAREN                    { let erect c = List.append (List.hd c) (List.hd (List.tl c)) in erect << $3 }
   ;
 arguments:  /* This is a list of functions */
   PARAM                                            { let func p = p in func }
 | funcexpr                                         { [$1] }
 | arguments arguments                              { List.append $1 $2 }

Возвращает ошибку: Ошибка: у этого выражения есть список строк типа -> список строк, но ожидалось выражение списка строк типа -> список строк типа Строка типа не совместима со списком строк типа

Я думаю, что нам нужно как-то поместить func в список, но все, что я пробовал, похоже, не работает! Любая помощь приветствуется..

2 ответа

Решение

Я предполагаю, что вы пытаетесь составить функции с оператором <<, который вы определили в другом месте.

К сожалению, $3 представляет собой не функцию, а список функций, поэтому вам нужно что-то сделать с $3, прежде чем составлять функции.

Я предлагаю вам изменить

let func p = p in func

к

[ let func p = p in func ]

или вы можете использовать более компактный:

[ fun p -> p ]

Это основано на наблюдении, что другие альтернативы для arguments вернуть список, но первая альтернатива - нет.

Другие вопросы по тегам