在我最初尝试创建一个不相交的集合数据结构时,我创建了一个Point
带有parent
指向另一个指针的数据类型Point
:
data Point a = Point
{ _value :: a
, _parent :: Point a
, _rank :: Int
}
为了创建一个单例集,创建了一个以Point
自身为父集的 a (我相信这被称为打结):
makeSet' :: a -> Point a
makeSet' x = let p = Point x p 0 in p
现在,当我想写findSet
(即跟随父指针,直到找到Point
它的父对象本身)时,我遇到了一个问题:是否可以检查是否是这种情况?一个幼稚Eq
的实例当然会无限循环——但这个检查在概念上是否可以编写?
(我最终使用 aMaybe Point
作为父字段,请参阅我的另一个问题。)