2009-09-05 6 views
3

플로트 목록의 평균을 찾으려고합니다.OCaml : List.fold_left는 어떻게 작동합니까?

let avg l = 
    List.fold_left (+.) 0 l /. List.length l;; 

List.fold_left는 어떻게 작동합니까? (목록의 첫 번째 인수 (세 번째 인수)를 적용합니다 ...하지만 두 번째 인수 무엇인가?)

최상위 레벨이 오류 반환 값 : 반복하는 선호하는 방법을 무엇

Characters 43-44: 
     List.fold_left (+.) 0 l /. List.length l;; 
          ^
Error: This expression has type int but is here used with type float 

을 OCaml에있는 목록?

답변

8

두 번째 인수는 누적 기의 초기 값입니다. 왼쪽 접기의 경우 목록 왼쪽에 시각적으로 배치 할 수 있습니다. 왼쪽 0의 초기 값으로 [1;2;3;4;5]을에 접어 그래서, 그것을 밖으로 작동이 경우에 따라서

((((0 + 1) + 2) + 3) + 4) + 5 

, 가장 안쪽의 괄호는 0이 있기 때문에 OCaml의에서 작동하지 않습니다하는 (0 +. 1.0)에 밖으로 작동 int이고 언어가 자동으로 float로 변환되지는 않습니다.

5

Chuck이 언급했듯이 int와 float 사이에는 자동 변환이 없습니다. 또한 부동 소수점 리터럴이기 위해서는 소수점 또는 지수 표기법을 가져야합니다.

코드를 수정하려면 부동 소수점 상수로 만들기 위해 0에 소수점을 추가해야합니다. 또한 int에서 float으로 길이를 변환해야합니다.

let avg l = 
    List.fold_left (+.) 0. l /. float_of_int (List.length l);;