OCaml の複素数計算
>
>Haskellの複素数計算
>。dan さんの日記を見たときに、おおむね一通りのところは確認したが私は日記には書いてなかったなぁ。ML系の言語で、ということで OCaml ででも。
>
>OCaml には標準で Complex というモジュールが付属しており、複素計算が可能になる。しかしながらこれがけっこうクセモノで、まず、演算子は定義されていない。それと、型の定義が単なるレコードなので書きづらい。 pi がどこにも定義されていないのもちょっとクセモノか。そこで次のようなファイルを作っておく。
>
>open Complex
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 の最高にグッタリ来る言語仕様のひとつ。 > >ま、ふつうに使えます。当り前ですが。 > >ちょっと思うこと。 >
let pi = { re = 3.141592653589793; im = 0. }
let e = exp { re = 1.; im = 0. }
let ( **: ) = pow
let ( *: ) = mul
let ( +: ) = add
let ( -: ) = sub
let ( /: ) = div
>
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 の最高にグッタリ来る言語仕様のひとつ。 > >ま、ふつうに使えます。当り前ですが。 > >ちょっと思うこと。 >