2016-10-13 5 views
0
let countA =0 in 
let countC =0 in 
let countG =0 in 
let countT =0 in 
let countChar x = 
    match x with 
    'A' -> countA = countA + 1 
    |'C'-> countC = countC + 1 
    |'G' -> countG = countG + 1 
    |'T'-> countT = countT + 1 
;; 

Я получаю синтаксическую ошибку, но я не понимаю, почему, я все еще довольно новичок в Ocaml.OCaml: попытка подсчета частоты символов в строке

ответ

2

Ошибка вашего синтаксиса возникает из-за того, что ваш последний let не имеет in после него. Это, в свою очередь, вызвано тем, что ваша функция countChar не определена на самом внешнем уровне (модуля). Если вы хотите, чтобы определить ряд имен верхнего уровня, вы должны определить их все без in:

let countA = 0 
let countC = 0 
let countChar x = ... 

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

Наиболее очевидными двумя являются (A), которые вы ожидаете, чтобы иметь возможность изменять значения countA и так далее. Но они неизменные ценности, вы не можете их изменить. (B) Вы используете =, как если бы это был оператор присваивания. Но в OCaml это оператор сравнения. Ваш код - только СравнениеcountA против countA + 1. Поэтому, конечно, результат false.

Конечно, стоит научиться вычислять с неизменяемыми значениями, поэтому я попытаюсь исправить этот код, научившись переносить кумулятивные значения как параметры функции и возвращать их в конце. Но если вы настаиваете на кодировании императивно, вам придется использовать ссылки для ваших подсчетов.

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

Update

Вот функция, которая подсчитывает, сколько появляются четные и нечетные Интсы в массиве. Она работает без мутирует ничего:

let eoa array = 
    let rec inner n (evenct, oddct) = 
     if n >= Array.length array then 
      (evenct, oddct) 
     else 
      let newcounts = 
       if array.(n) mod 2 = 0 then (evenct + 1, oddct) 
       else (evenct, oddct + 1) 
      in 
      inner (n + 1) newcounts 
    in 
    inner 0 (0, 0) 

Вот как это выглядит, когда вы запустите его:

# eoa [| 3; 1; 4; 1; 5; 9; 2 |];; 
- : int * int = (2, 5) 
+0

Спасибо за отзыв, я мог бы попробовать использовать эталонный подход к ним, так как я не верьте, что ocaml имеет изменяемые объекты. –

+0

Хм. Ну, у OCaml есть изменяемые объекты, а ссылки - изменяемые объекты. Также стоит отметить, что массивы OCaml являются изменяемыми. Возможно, стоит посмотреть. –

+0

В настоящее время я работаю над проектом, откуда пришел этот код, и задавался вопросом, можете ли вы его проверить и дать мне несколько указателей. http://stackoverflow.com/questions/40034210/ocaml-how-to-count-substring-in-a-string?noredirect1_comment67350159_40034210 Я задал вопрос по этой ссылке –

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