2017-10-25 11 views
3

OCamlに入ってみようとしていて、コードをコンパイルする際に問題が発生しています。 ocamlc -o all all.mlでそのコードをコンパイルしようとするとダブルセミコロンを使用しないとocamlcが失敗する

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.) 

は私に次のエラーを与える:私はトップレベルでそれを入力するか、二重のセミコロンを追加した場合

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 `;'. 

しかし、コードがうまく動作します。.. 。

# 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

2つのセミコロンがないと、互いに隣に複数の式があります。最初はarea_of_ringarea_of_circleへの呼び出しで、第2はinner_radius、第3はPrintf.printfなどです。コンパイラが説明しようとする理由から、これは意味がありません。

多くの言語と同様に、スペースや改行はOCaml構文にとって意味がありません。コンパイラはそれを1つの大きな表現と見なします。

あなたPrintf.printfのようなトップレベルの式を書くための良いイディオムはこのようなものです:(。これは私が私のコードを書く方法です)

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

+1

ああ、明記しないことによってので、そのプリントラインコンパイラがarea_of_ring関数の次の行としてそれを読み込もうとしていましたか? – Nathan

+2

はい、そうです。 –

+0

素晴らしい!それは完璧な意味合いがあります。初めて関数型言語を手に入れたので、命令的でないスタイルの規則や構文に慣れるのは少し難しいです。 – Nathan

関連する問題