2016-10-15 27 views
0

所述指令如何循環訪問Ocaml中的數組以返回值?

  • 初始化規範爲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的一個原因是看到不可變數據(沒有引用)和高階函數(如fold)的強大功能。 –