我需要操縱像1 + sqrt(3)這樣的表達式,並進行基本的算術,如加法,減法和除法。我希望結果具有某種規範形式,以便它可以用作地圖中的關鍵字。由於舍入問題,將1 + sqrt(3)轉換爲浮點數是不可行的。像SymPy一樣的Haskell庫?
我在SymPy中使用了Python中的這個任務。 Haskell有一個等效的本地庫嗎?
我需要操縱像1 + sqrt(3)這樣的表達式,並進行基本的算術,如加法,減法和除法。我希望結果具有某種規範形式,以便它可以用作地圖中的關鍵字。由於舍入問題,將1 + sqrt(3)轉換爲浮點數是不可行的。像SymPy一樣的Haskell庫?
我在SymPy中使用了Python中的這個任務。 Haskell有一個等效的本地庫嗎?
請檢查出the numbers
package。如果您只需存儲「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模塊,但描述中顯示「它主要用於調試」。
看來您正在尋找Haskell中的計算機代數系統(CAS)。儘管Haskell包/模塊名稱中引用了很多代數對象,但我從未聽說過Haskell中的通用目的和維護良好的CA系統(如SymPy或Python中的Sage)。
但是在the list of Computer Algebra Systems在維基百科上,我發現了一個參考
DoCon. The Algebraic Domain Constructor
它採用了non-standard license,但我敢說它仍然是開源的(雖然重命名和歸屬的需求)。截至2010年7月docon-2.11
仍然使用GHC 6.12.1構建並運行演示/測試(我只需在演示文件的一個文件中插入LANGUAGE FlexibleContexts
編譯指示)。
DoCon有據可查(362頁手冊)。它的手冊是擠滿了源拉鍊的裏面,所以我把它放到網上分別爲方便:
請瀏覽並檢查它是否適合你的需要。
查看cyclotomic包,該包實現了分圓數的精確算術運算。這些包括所有代數數字(因此特別是1 + sqrt(3))和關鍵操作(如相等)是可確定的。
它們沒有提供Ord
實例(出於同樣的原因,複數不需要),但是如果所有人都需要將它們用作查找表中的鍵,則可以實現非語義實例。您可能需要聯繫作者,瞭解如何正確執行此操作,因爲可能存在一些不明顯的不變量(例如,可能需要注意地圖中的零點)。
你想'√2 - 1 == 1 /(√2+ 1)'? – kennytm 2010-07-21 13:53:55