関数を定義するスタイル

 

ついでですが、funを使うと同じ関数をいろいろなスタイルで定義することもできます。たとえば

 

# let distance x y = sqrt (x *. x +. y *. y) ;;

val distance : float -> float -> float = <fun>

 

のかわりに

 

# let distance = fun x y -> sqrt (x *. x +. y *. y) ;;

val distance : float -> float -> float = <fun>

 

 

# let distance = fun x -> fun y -> sqrt (x *. x +. y *. y) ;;

val distance : float -> float -> float = <fun>

 

のように書いても同じです。引数を一つずつ順に受け取るのではなく、組としてまとめて受け取るスタイルについても、

 

# let distance (x, y) = sqrt (x *. x +. y *. y) ;;

val distance : float * float -> float = <fun>

 

のかわりに

 

# let distance = fun (x, y) -> sqrt (x *. x +. y *. y) ;;

val distance : float * float -> float = <fun>

 

と定義することが可能です。ただし、あまりわかりにくくなってもしようがないので、普通は最初のlet distance x y = ...という構文を使用します。

 

問題: 次の中に一つだけ型の違う式があります。どれでしょうか。

1.        fun x y -> abs (x - y)

2.        fun x -> fun y -> abs (x - y)

3.        let dist x y = abs (x - y) in
dist

4.        let dist (x, y) = abs (x - y) in
dist

5.        let dist (x, y) = abs (x - y) in
fun x y -> dist (x, y)

ただしabsは整数を受け取って、その絶対値を返す関数です。

解答: 4.

 

次へ進む