2016-10-15 4 views
0

ИнструкцииКак перебрать массив в Ocaml, чтобы вернуть значение?

  • Initialize нормой 0,0
  • перебрать массив
  • добавить в норме квадрат текущий компонент массива
  • возвращение норма

Мой код

type vector = float array 
let norm_loop (vector: vector) = 
    let norm = ref 0.0 in 
    for x = 0 to (Array.length vector) - 1 do 
    norm := (!norm +. (vector.(x)*.vector.(x))) 
    done in 
    norm 

Но когда я печатаю, что в uTop он говорит

# let norm_loop (vector: vector) = 
     let norm = ref 0.0 in 
     for x = 0 to (Array.length vector) - 1 do 
     norm := (!norm +. (vector.(x)*.vector.(x))) 
     done in 
     norm;; 
Characters 4-13: 
Warning 26: unused variable norm_loop. 
- : float ref = {contents = 0.} 

Я не уверен, что я делаю неправильно utop думать norm_loop является переменной. Все, что я хочу сделать, это вернуть norm, но я не могу понять, как это сделать.

Любая помощь была бы принята с благодарностью!

ответ

3

Ваш второй in является излишним. Там нет let, который идет с ним. Вместо этого вы должны иметь это в последние несколько строк:

done; 
!norm 

Обратите внимание, что вы возвращавшуюся ссылку, но вы хотите вернуть поплавок (я предполагаю). Поэтому вам нужно написать !norm вместо norm.

3

Обратите внимание, что вы можете также использовать Array.fold_left для достижения того же результата:

let norm (vector : vector) = 
    Array.fold_left (fun acc v -> acc +. v *. v) 0.0 vector 
+1

Абсолютно, используя складку гораздо более идиоматических OCaml. Одной из причин изучения OCaml является просмотр силы неизменяемых данных (без ссылок) и функций более высокого порядка (например, складки). –