【发布时间】:2013-10-21 18:07:25
【问题描述】:
在Scheme 中,原语eq? 测试它的参数是否是同一个对象。例如,在下面的列表中
(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 是否相等,我必须天真地遍历十亿个节点才能发现它们是同一棵树,这应该是显而易见的,因为数据分享。
我不希望有一种简单的方法来发现 Haskell 中的数据共享,但我想知道处理此类问题的典型方法是什么,何时检测共享以提高效率(或例如检测循环数据结构)。
是否有可以检测共享的unsafe 原语?有没有一种众所周知的方法来构建具有显式指针的数据结构,以便您可以比较指针是否相等?
【问题讨论】:
-
执行此操作时,请始终考虑您的数据结构包含 NaN 或其他与自身比较不相等的值的可能性。您的优化可能是一项破坏性的优化。
标签: haskell functional-programming