演算子

前置・中置演算子も一種の関数なので,ふつうの関数と同じように定義できる。ただし,名前を括弧で囲むのと使える文字に制限がある。

# let (^-^) x y = x * 2 + y * 3;;
val ( ^-^ ) : int -> int -> int = <fun>
# 2 ^-^ 3;;
- : int = 13
# 5 ^-^ 9;;
- : int = 37

演算子に使える文字は次の通り。

前置演算子の1文字目:

! ? ~

中置演算子の1文字目:

= < > @ ^ | & + - * / $ %

2文字目:

! $ % * + - . / : < = > ? @ ^ | ~

中置演算子には上記のほかに次のキーワードが使える。

asr land lor lsl lsr lxor mod or !=

また,前置・中置とも次のキーワードは使えない。

#  '  (  )  ,  -> .  .. :  :: :> ;  ;; <- >]
?  ?? [  [< [> [| ]  _  `  {  {< |  |] }  ~

練習問題 3.14

p.67より。

実数上の関数 f に対して定積分 ¥normalsize¥int_a^b{f(x)}dx を近似計算する関数 integral f a b を定義しなさい。またこれを使って,¥normalsize¥int_0^{¥pi}{sin x}dx を計算しなさい。

近似の方法は台形近似。積分区間を100個の台形に分けて面積を合計する。

# let integral f a b =
let d = (b -. a) /. 100. in
let trapezoid x y z = (x +. y) *. z /. 2. in
let rec area i =
if i = 0. then 0.
else trapezoid (f (a +. d *. (i -. 1.))) (f (a +. d *. i)) d +. area (i -. 1.)
in
area 100.
;;
val integral : (float -> float) -> float -> float -> float = <fun>

あんまりきれいじゃないけどいいか。 + と +. を間違えてて時間がかかった。整数と実数で演算子が違うってのはどうもなれないな。

# let pi = 3.141592;;
val pi : float = 3.141592
# integra sin 0. pi;;
- : float = 1.9998355039556754