1 + sqrt(3) のような式を操作し、加算、減算、除算などの基本的な算術演算を行う必要があります。マップのキーとして使用できるように、結果を何らかの標準形式にしたいと考えています。丸めの問題により、1 + sqrt(3) を float に変換することはできません。
Python でのこのタスクには SymPy を使用しました。Haskell に相当するネイティブ ライブラリはありますか?
1 + sqrt(3) のような式を操作し、加算、減算、除算などの基本的な算術演算を行う必要があります。マップのキーとして使用できるように、結果を何らかの標準形式にしたいと考えています。丸めの問題により、1 + sqrt(3) を float に変換することはできません。
Python でのこのタスクには SymPy を使用しました。Haskell に相当するネイティブ ライブラリはありますか?
Haskell で Computer Algebra System (CAS) を探しているようです。Haskell のパッケージ/モジュールの名前に代数オブジェクトへの参照が非常に多いにもかかわらず、Haskell の汎用でよく管理された CA システム (Python の SymPy や Sage など) については聞いたことがありません。
ただし、ウィキペディアのコンピューター代数システムのリストで、への参照を見つけました
非標準のライセンスを使用していますが、それでもオープン ソースであると断言できます (ただし、名前の変更と帰属の要件があります)。2010 年 7 月docon-2.11
現在、GHC 6.12.1 でビルドし、デモ/テストを実行します (デモLANGUAGE FlexibleContexts
の 1 つのファイルにプラグマを挿入するだけで済みました)。
DoCon は十分に文書化されています (マニュアルの 362 ページ)。そのマニュアルは、zip 内にソースと共にパックされているため、便宜上、個別にオンラインにしました。
あなたのニーズに合っているかどうかを確認してください。
パッケージをnumbers
ご覧ください。「1 + √3」のような正確な数値を格納するだけでよい場合は、記号演算の代わりにData.Number.CRealを使用することをお勧めします。式を保存し、必要に応じて任意の桁数まで計算できます。
Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal)
Prelude Data.Number.CReal> showCReal 400 cx
"2.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450949989524788116555120943736485280932319023055820679748201010846749232650153123432669033228866506722546689218379712270471316603678615880190499865373798593894676503475065760507566183481296061009476021871903250831458295239598329977898245082887144638329173472241639845878553977"
パッケージには Data.Number.Symbolic モジュールもありますが、説明には「主にデバッグに役立ちます」と書かれています。
円分数の正確な算術演算を実装する、 cyclotomicパッケージを確認してください。これらにはすべての代数的数 (したがって、特に 1+sqrt(3)) が含まれ、重要な演算 (等式など) は決定可能です。
それらはOrd
インスタンスを提供しませんが (複素数が提供しないのと同じ理由で)、ルックアップ テーブルのキーとしてそれらを使用することだけが必要な場合は、非セマンティック インスタンスを実装できます。明らかでない不変条件がいくつかあるかもしれないので、これを正しく行う方法について作者に連絡したいかもしれません (例えば、coeffs
マップのゼロに注意する必要があるかもしれません)。