引数が複数の関数を定義したかったら、二通りのやり方があります。一つは、引数を(x, y)のような組にして受け取るやり方です。
# let distance (x, y) = sqrt (x *. x +. y *. y) ;;
val distance : float * float -> float = <fun>
# distance (3.0, 4.0) ;;
- : float = 5.
distanceはfloat * float -> floatという型を与えられます。これは「floatとfloatの組を受け取ってfloatを返す関数」という意味です。
もう一つは、引数を一つずつ順に受け取るやり方です。
# let distance x y = sqrt (x *. x +. y *. y) ;;
val distance : float -> float -> float = <fun>
# distance 3.0 4.0 ;;
- : float = 5.
このfloat -> float -> floatという型は「二つのfloatを一つずつ順に受け取って、floatを返す関数」という意味です。
OCamlでは、どちらかといえば後者が普通のスタイルとされています(カリー化といいます)。前者と後者では型が違うので、混同できないことに注意してください。
# let distance x y = sqrt (x *. x +. y *. y) ;;
val distance : float -> float -> float = <fun>
# distance (3.0, 4.0) ;;
Characters 9-19:
distance (3.0,
4.0) ;;
^^^^^^^^^^
This expression has type float * float but is here used with
type float