2017-10-25 8 views
3

OCaml을 사용하려고하는데 코드를 컴파일하는 데 문제가 있습니다. 내가 최고 수준에 그것을 입력하거나 이중 세미콜론을 추가하는 경우, 코드가 잘 실행, 그러나이중 세미콜론을 사용하지 않으면 ocamlc이 실패합니다.

File "all.ml", line 4, characters 35-49: 
Error: This function has type float -> float 
    It is applied to too many arguments; maybe you forgot a `;'. 

.. : ocamlc -o all all.ml과 그 코드를 컴파일하려고

let area_of_ring inner_radius outer_radius = 
    let pi = acos (-1.) in 
    let area_of_circle r = pi *. r *. r in 
    area_of_circle outer_radius -. area_of_circle inner_radius 

Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.) 

나에게 다음과 같은 오류를 제공합니다

# let area_of_ring inner_radius outer_radius = 
     let pi = acos (-1.) in 
     let area_of_circle r = pi *. r *. r in 
     area_of_circle outer_radius -. area_of_circle inner_radius;; 
val area_of_ring : float -> float -> float = <fun> 

# Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.);; 
Area of ring: 25.132741 
- : unit =() 

누군가가 무슨 일이 일어나는지 설명 할 수 있습니까? 중요한 것은 아니지만 어디서나 더블 세미콜론없이 프로그램을 작성하고 싶습니다.

답변

5

세미콜론이 두 개 없으면 서로 옆에 여러 개의 표현식이 있습니다. 첫 번째는 area_of_ringarea_of_circle 전화 번호이고 두 번째 전화 번호는 inner_radius이며 세 번째 전화 번호는 Printf.printf입니다. 이것은 컴파일러가 설명하려고하는 이유 때문에 의미가 없습니다.

많은 언어에서와 마찬가지로, 공백과 개행 문자는 OCaml 구문에 의미가 없습니다. 그래서 컴파일러는 이것을 하나의 큰 표현으로 봅니다.

당신의 Printf.printf 같은 최상위 표현식을 작성하기위한 좋은 관용구는 다음과 같다 : (. 이것은 내가 내 코드를 작성하는 방법입니다)

let() = Printf.printf "Area of ring: %f\n" (area_of_ring 1. 3.) 

+1

아, 명시하지 않음으로써 그래서 인쇄 라인 새로운 표현식이거나 그런 식으로 컴파일러가 area_of_ring 함수의 다음 줄로 읽으려고 했습니까? – Nathan

+2

네, 맞습니다. –

+0

좋아요! 그건 완벽하게 이해가됩니다. 처음에는 함수형 언어를 사용하기 때문에 비 명령형 스타일 규칙 및 구문에 익숙해지는 것은 약간 어렵습니다. – Nathan