Haskellで代数的実数の型を実装してみたが、 これをRealクラスのインスタンスにするか悩んでいる。 というのは、Realクラスは toRational :: Real a => a -> Rational を要求するため。
選択肢:
1) Realクラスのインスタンスは実装しない。ただ、Realクラスを実装しないとそのサブクラスのRealFracも実装できず、floorとかroundとかが標準的インターフェースで使えないのがちょっと痛い。
2) Realクラスのインスタンスを実装し、toRationalは適当な近似値を返す。 でも、toRationalは正確な値を返されると仮定していることが多い気がして、無言で誤差を混入するのは気持ち悪い。
3) Realクラスのインスタンスを実装し、toRationalはエラーにする。本来定義されていてしかるべき演算をそういう都合でエラーにするのはなぁ・・・
もっと圏論的に取り扱うほうが良いと思う.
(量a \in Aと量b \in B の演算を行うときは A \otimes B にcoerceし,クラスや型を集合にマップするのはやめる)
それと実だけではなくp進も平等に扱うほうが良いと思う.
それから実は複素の 有限精度の表現は浮動小数点ではなくトロピカルに扱ったほうが良いと思う.
で,こんなの作ってみました.
https://gist.github.com/1308075 (アデールとか)
https://gist.github.com/1260985 (トロピカルな複素数とか)
全然作りかけなんですけど.