OCaml の複素数計算

This entry was posted by on Sunday, 14 May, 2006
> >Haskellの複素数計算 >。dan さんの日記を見たときに、おおむね一通りのところは確認したが私は日記には書いてなかったなぁ。ML系の言語で、ということで OCaml ででも。 > >OCaml には標準で Complex というモジュールが付属しており、複素計算が可能になる。しかしながらこれがけっこうクセモノで、まず、演算子は定義されていない。それと、型の定義が単なるレコードなので書きづらい。 pi がどこにも定義されていないのもちょっとクセモノか。そこで次のようなファイルを作っておく。 > >open Complex

let pi = { re = 3.141592653589793; im = 0. }

let e = exp { re = 1.; im = 0. }

let ( **: ) = pow
let ( *: ) = mul
let ( +: ) = add
let ( -: ) = sub
let ( /: ) = div > >んで、こうなる。 > ># #use "test.ml";;
val pi : Complex.t = {re = 3.14159265358979312; im = 0.}
val e : Complex.t = {re = 2.71828182845904509; im = 0.}
val ( **: ) : Complex.t -> Complex.t -> Complex.t = <fun>
val ( *: ) : Complex.t -> Complex.t -> Complex.t = <fun>
val ( +: ) : Complex.t -> Complex.t -> Complex.t = <fun>
val ( -: ) : Complex.t -> Complex.t -> Complex.t = <fun>
val ( /: ) : Complex.t -> Complex.t -> Complex.t = <fun>
# pi;;
- : Complex.t = {re = 3.14159265358979312; im = 0.}
# i;;
- : Complex.t = {re = 0.; im = 1.}
# e **: (i *: pi);;
- : Complex.t = {re = -1.; im = 1.22460635382237726e-16}
# exp (i *: pi);;
- : Complex.t = {re = -1.; im = 1.22460635382237726e-16}
# log { re = -1.; im = 0. };;
- : Complex.t = {re = 0.; im = 3.14159265358979312}
> >i は Complex に最初から定義されている。 #use は、そのファイルを読み込んで現在のトップレベル環境で評価するというコマンド。あとはだいたい見ての通りかのう。ちなみに OCaml では、演算子は (+) のようにカッコをつけるのだが、 (* 〜 *) がコメントという言語仕様なため (**:) のように書いてはいけない(コメント開始とみなされ、コンパイルエラーになる)。 OCaml の最高にグッタリ来る言語仕様のひとつ。 > >ま、ふつうに使えます。当り前ですが。 > >ちょっと思うこと。 > > >Complex は re や im の型が float 限定。多相的になっていない。ある種の用途では困ることもあるかもしれない > >たとえば Big_int や Rational な Complex は不可能ということ > > > > > >演算子等がぜんぜん定義されておらず、ぜんぶふつうの識別子を使うのは言語の流儀の差かなぁ…… > > > > >(追記)かぶりまくりだなぁ。まぁいいや。個人的には、複素数の計算ができたから、何?という気もしないでもない。 >

Comments are closed.