我正在尋找實作支持多個“無窮大”的“通用”序數型別(例如 [1,2,..., W, W 1, W 2, .. , 2 W, .., WW 等])。我正在考慮實作為一個復合數(例如 [5:4:2578] < [1:5:4:2578] < [1:5:4:2579] < [1:5:5:2]) Ints,比較從串列末尾開始。
目前我已將其實作為:
newtype Ordinal = Order [Int]
deriving (Eq)
instance Ord Ordinal where
(<=) x@(Order xl) y@(Order yl)
| null xl && null yl = x == y
| null xl = (Order [0]) <= y
| null yl = x <= (Order [0])
| last xl /= last yl = last xl <= last yl
| otherwise = (init xl) <= (init yl)
我覺得我的代碼不夠干凈/優雅。是否有已經這樣做的標準化庫/資料型別?我可以更多地重構我的代碼嗎?
uj5u.com熱心網友回復:
從根本上說,正如@4castle 所指出的那樣,您有一個邏輯錯誤。簡而言之,您應該只比較具有相同重要性的最高有效數字。例如,[1,2]明顯大于[3]即使最后一個元素[3]大于最后一個元素,[1,2]因為2比 更重要3。您可能會發現這length在這里很有用。
一種優雅的策略是初步檢查您的一個Ordinals 是否明顯大于另一個(即,具有更高重要性的數字,或者“結構上更大”),如果不是,則僅繼續遞回底層數字檢查. 因此,考慮將遞回部分定義為輔助函式;并且由于它無論如何都是一個輔助函式,您可以使用reverse序數串列的 呼叫它,允許您對串列進行簡單的模式匹配,首先比較最高有效位,而不需要像lastand之類的“丑陋”函式init。
uj5u.com熱心網友回復:
對于誰在乎,我選擇了以下實作(在 Haskell reddit 的幫助下,特別是用戶 xplaticus 的幫助下):
compare x@(Order xl) y@(Order yl) = compare (length xl',xl') (length yl',yl')
where
xl' = dropWhile (0==) xl
yl' = dropWhile (0==) yl
他的解釋與 DDub 的類似,因此我在這里給了 DDub 已解決的檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517140.html
標籤:哈斯克尔整数序数序数
下一篇:Solo如何防止空間泄漏?
