在 Haskell 中,相等性測驗通常使用==來Eq類執行。這個函式(在大多數情況下)是在純 Haskell 術語下定義的,因此它遵循遞回地將其應用于大資料結構的所有后果。因此,看似微不足道的比較可能會花費大量時間。來吧,這應該是即時的(提醒懶惰):
ghci> let x = [1..100000000] in x == x
True
(2.81 secs, 14,400,130,800 bytes)
為什么 Haskell 在這里不使用參考比較?如果我真的愿意,Haskell 是否允許我這樣做?
uj5u.com熱心網友回復:
簡短的回答:不,這在 Haskell 中是不可能的,并且有很好的理由。參考相等是語言設計的基本部分,保留它使 Haskell 與語言設計空間中的許多其他語言不同。
稍長一點的答案:這是一個經過充分研究的主題,通常被稱為可觀察共享,至少可以追溯到 2000 年代初期:
Claessen 和 Sands 解釋了可觀察共享在哪些情況下有用以及如何將其合并到語言中。這是一篇非常容易閱讀的論文,它詳細解釋了這個問題并建議了一個非保守的擴展。有利于理解基本問題。
Gill 對這個問題的解決方案是在實踐中使用的一種非常可行的方法,稱為型別安全的可觀察共享。這里的想法是您可以在純代碼中創建等式,但您只能在 monadic IO 背景關系中觀察它們;它保留了參照平等。它沒有假陰性,也很少有假陽性。這個想法還有一個關于hackage的實作,你可以很容易地使用。
長話短說:不,你不能做參考相等,或指標相等,或直接觀察 Haskell 中的共享,這是有充分理由的。這個問題得到了很好的研究和理解,并且有一些實用的解決方案可以在不破壞參考透明度的情況下解決 Haskell 生態系統中的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452945.html
下一篇:空約束有什么用?
