2015-12-06 3 views
0

Я хочу изменить существующий массив с помощью этой функции, но по какой-то причине я не понимаю, как только я применил функцию к массиву, значения не изменяются. Что мне не хватает?OCaml - Изменить значения массива

Заранее спасибо

let test v (a,b) = 
for i=a to b do 
    if ((Array.get v i)>(Array.get v i+1)) then 
     let tmp = (Array.get v i) in 
      v.(i)<-(Array.get v i+1); 
      v.(i+1)<-tmp;   
done;; 

ответ

1

Ошибка в Array.get V I + 1: это подразумевает, что v является целочисленным массивом, и что вы добавляете 1 и сделать условие всегда ложно. Просто поставьте i + 1 в скобках: v будет массивом любого типа, и он решит вашу проблему.

let test v (a,b) = 
for i=a to b do 
    if Array.get v i > Array.get v (i+1) then 
     let tmp = (Array.get v i) in 
      v.(i)<-(Array.get v (i+1)); 
      v.(i+1)<-tmp;   
done;; 

Вы могли бы написать, используя v. (I)> v. (I + 1).

1

Лучшая практика заключается в том, чтобы помещать пробелы в функциональные приложения, включая бинарные операторы.

Многие новички, как правило, не понимают

Array.get v i+1 

как Array.get v (i+1) но если она написана как

Array.get v i + 1 

то вероятность ошибки должны пойти гораздо ниже.