2015-02-24 8 views
0

Я пытаюсь реализовать этот алгоритм, но я продолжаю получать синтаксическую ошибку на 12-й строке, но я не могу определить, что ее вызывает. Я новичок в ocaml, и любая помощь будет очень признательна.Что вызывает здесь синтаксическую ошибку?

«Для того, чтобы найти все простые числа меньше или равно заданному числа п по методу Эратосфена:

Создать список последовательных целых чисел от 2 до п: (2, 3, 4, ... , n). Изначально пусть p равно 2, первое простое число. Начиная с p, перечислите его кратность путем подсчета до n с шагом p и пометьте их в списке (это будут 2p, 3p, 4p, ..., сам p не должен быть помечен). Найдите первое число, большее чем p в списке, не отмеченном. Если такого номера не было, остановите. В противном случае пусть p теперь будет равным этому новому номеру (который равен следующее простое) и повторите с шага 3. "

let prime(n) = 
    let arr = Array.create n false in 
    let set_marks (arr , n , prime) = Array.set arr (n*prime) true in 
     for i = 2 to n do 
      set_marks(arr,i,2) done 

    let findNextPrimeNumberThatIsNotMarked (arr, prime , index) = 
     let nextPrime = Array.get arr index in 
     let findNextPrimeNumberThatIsNotMarkedHelper (arr, prime, index) = 
      if nextPrime > prime then nextPrime 
      else prime in  

    ;; 

ответ

1

OCaml имеет выражение let a = b in c. Ваш код заканчивается in, но где c? Похоже, вам стоит просто удалить in в конце.

Глядя более внимательно, я вижу, что есть больше проблем, чем это, извините.

Функция в OCaml будет выглядеть примерно:

let f x = 
    let a = b in 
    let c = d in 
    val 

Ваше определение prime выглядит точно так же, как это, за исключением того, что она заканчивается в for цикле, т.е. с ключевым словом done.

Остальная часть кода формирует второе, независимое определение функции. Она имеет форму, как это:

let f x = 
    let a = b in 
    let g x = expr in 

Синтаксическая проблема заключается в том, что вы пропали без вести после того, как выражение in.

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

Одна вещь, которая может быть полезна (для программирования поэтапного стиля), состоит в том, что вы можете написать expr1; expr2 для оценки двух выражений один за другим.

+0

Я пробовал это, но это не решило проблему. – user3567081

+0

Достаточно честный. Но никакая действительная программа OCaml не может закончиться 'in'. Это верно. Я сделаю еще одно предложение. –

2

Добавление ответа Джеффри,

Как я уже вам ответил на «What exactly is the syntax error here?»,

Что вы абсолютно необходимо сделать прямо сейчас, чтобы установить и использовать правильный инструмент отступа OCaml и авто -интенсивные линии. Неожиданные результаты с автоматическим отступом часто указывают на синтаксические ошибки, такие как забывание ;. Без таких инструментов очень сложно даже талантливым программистам OCaml писать код OCaml без синтаксических ошибок.

Есть куча авто индентор для OCaml доступна:

  • OCP-отступ для Emacs и Vim https://github.com/OCamlPro/ocp-indent
  • режим Caml и режим Tuareg для Emacs
  • Vim должен иметь некоторые другие индентор но я не знаю ...