在Scheme中,原語eq?
測試它的參數是否是同一個對象。例如,在下面的列表是否有可能在Haskell中檢測共享?
(define lst
(let (x (list 'a 'b))
(cons x x)))
的
(eq? (car x) (cdr x))
的結果爲真,而且它是真實無需窺視(car x)
和(cdr x)
。這使您可以爲擁有大量共享的數據結構編寫高效的相等性測試。
Haskell有可能是同一件事嗎?例如,考慮以下二叉樹實現
data Tree a = Tip | Bin a (Tree a) (Tree a)
left (Bin _ l _) = l
right (Bin _ _ r) = r
mkTree n :: Int -> Tree Int
mkTree 0 = Tip
mkTree n = let t = mkTree (n-1) in Bin n t t
它在每個級別共享。如果我用let tree = mkTree 30
創建一棵樹,並且我想看看left tree
和right tree
是否相等,天真地我必須遍歷10億個節點才能發現它們是同一棵樹,這應該是顯而易見的,因爲數據共享。
我不希望有一個簡單的方法來發現Haskell中的數據共享,但我想知道處理這類問題的典型方法是什麼,當爲了效率目的而檢測共享(例如檢測循環數據結構)。
是否有unsafe
可以檢測共享的基元?有沒有一種衆所周知的方式來構建具有顯式指針的數據結構,以便您可以比較指針相等?
又見http://stackoverflow.com/questions/1717553/pointer-equality-in-haskell – Yuras
執行此操作時,始終考慮您的數據結構包含NaN或其他值不等於比較的可能性他們自己。您的優化可能是一個突破。 – rightfold