2016-12-29 12 views
1

Я столкнулся с синтаксической ошибки в коде ниже:Ocaml суммируя значения в списке целого

let sum list = 
let current_sum = List.hd list in 
for i = 1 to List.length list - 1 do 
let counter = List.nth list i 
    current_sum = current_sum + counter 
done;; 

ошибка, что я облицовкой здесь

done; 
^^^^ 
Error: Syntax error 

код должен суммировать текущие значения списка на каждой итерации, например

sum [1;2;3;4];; 
- : int list = [1; 3; 6; 10] 

Так что я думаю, что я буду об этом в правильном направлении, то, Я не понимаю, почему эта ошибка продолжает появляться?

ответ

4

Ключевое слово in отсутствует в операторе let counter.

Еще одна ошибка, которая появится после: current_sum является неизменной. Вам придется изменить это.

Другой способ достижения вашей суммы: использовать функцию List.fold.

Ввод в форме приведенных ниже комментариев:

let sum_l l = 
    let (r,_) = List.fold_left 
     (fun (a_l, a_i) x -> ((a_i + x) :: a_l , a_i+x)) 
     ([],0) l in 
    List.rev r;; 
+0

Я немного поиграю с функцией fold, но чем больше я играю с Ocaml, тем больше я понимаю, что для циклов это не так удобно, спасибо снова, приятель, мне, вероятно, понадобится дополнительная помощь, если это нормально – Ibo

+0

yep ... loop - структура, очень распространенная в императивном стиле программирования. В ocaml вы будете использовать функцию & recursion. Вы измените способ просмотра программ;). Некоторые полезные ссылки: https://github.com/rizo/awesome-ocaml и https://realworldocaml.org/v1/en/html/index.html. Может быть, вы уже знаете их. –

+0

Да, я знаю о них: D, могу ли я использовать List.чтобы создать функцию, которая суммирует целые числа на каждой итерации и сохраняет их в списке, подобном этому: – Ibo

2

Вы просто забыли in keywork в вашей линии 4.

Однако, OCaml является functional language, и вы пытаетесь использовать императив метод здесь.

Несмотря на то, что он будет работать, когда вы решите ошибку синтаксиса, это не так, как вы делали бы это в OCaml. Например, функция суммируя элементы списка целочисленном можно сделать с помощью следующих действий:

let sum = List.fold_left (+) 0;; 

или даже

let sum = List.reduce ~f:(+);; 

, если вы используете Core библиотеку.

EDIT

После прочтения комментариев под другой ответ, я понял, что ты на самом деле пытается сделать:

# sum [1;2;3;4];; 
- : int list = [1; 3; 6; 10] 

А вот способ сделать это, с использованием функциональных возможностей OCaml:

let sum l = 
    let sums = 
    List.fold_left (fun l x -> match l with 
     | [] -> [x] 
     | h::t -> (x+h)::l) [] l 
    in List.rev sums;; 

Код более сложный, чем просто вычисляя сама сумму, но она делает трюк.

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

  • Нет связанных вопросов^_^