Scheme では、プリミティブeq?
はその引数が同じオブジェクトかどうかをテストします。たとえば、次のリストでは
(define lst
(let (x (list 'a 'b))
(cons x x)))
結果として
(eq? (car x) (cdr x))
は true であり、さらに とを覗き込まなくても trueです。これにより、多くの共有を持つデータ構造の効率的な等価テストを作成できます。(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
かどうかを確認したい場合、10 億を超えるノードを単純に調べて、それらが同じツリーであることを発見する必要があります。これは、データ共有のために明らかなはずです。left tree
right tree
Haskell でデータ共有を発見する簡単な方法があるとは思いませんが、このような問題に対処するための典型的なアプローチは何だろうと思いました。構造)。
unsafe
共有を検出できるプリミティブはありますか? ポインターの等価性を比較できるように、明示的なポインターを使用してデータ構造を構築するよく知られた方法はありますか?