2013-10-27 3 views
3

Мне нужно создать функцию, которая отображает каждый элемент из набора строк. Я сделал следующее:Ошибка синтаксиса OCaml в функции

module S = Set.Make(String);; 
module P = Pervasives;; 
let write x = (
     P.print_string("{"); let first = true; 
    S.iter (fun str -> (if first then() else P.print_string(","); P.print_string(str))) x; 
    P.print_string("}"); 
    P.print_newline 
);; 
^

В конце программы (там, где я поместил этот знак) оказывается у меня есть ошибка: ошибка синтаксиса: оператор ожидаемая. Пожалуйста, помогите мне решить эту проблему.

ответ

4

Я считаю, что ваша синтаксическая проблема связана с let. За исключением кода верхнего уровня (внешний уровень модуля), let должен сопровождаться in.

Есть много других проблем с этим кодом, но, возможно, это позволит вам найти следующую проблему :-)

Несколько примечаний:

Переменные в OCaml неизменны. Таким образом, ваша переменная с именем first всегда будет правдой. Вы не можете его изменить. Эта (казалось бы, незначительная) точка является одним из ключей к функциональному программированию.

Вам не нужно ссылаться на модуль Pervasives по имени. Вот почему это называется «повсеместным». Вы можете просто сказать print_string.

Ваш последний звонок print_newline не является вызовом. Это выражение просто оценивает сама функция. (Вам нужно дать аргумент, если вы хотите вызвать функцию.)

+0

Спасибо! Я только начал использовать oCaml в своем университете, поэтому я полный аутсайдер. Есть ли способ, которым я могу выполнить блок кода только в первом элементе набора? – Andrew

+0

Одним из способов, которым может быть хороший стиль, может быть сложение поверх набора, а не итерация. Сгиб позволяет вам переносить состояние (это то, что вы хотите сделать). –

+0

Я написал код, используя fold, а не iter, который работает так, как я этого хотел. Моя единственная проблема в том, что упражнение, которое я пытаюсь решить, особенно просит меня использовать iter. Я могу решить его с помощью iter, но я покажу его как: {string1, string2,}. У меня будет дополнительная запятая перед скобкой. – Andrew

3

Попробуйте заменить точку с запятой после let first = true ключевыми словами in.

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