Schemeでは、プリミティブeq?
は、その引数が同じオブジェクトであるかどうかをテストします。例えば、以下のリストハスケルでの共有を検出することは可能ですか?
(define lst
(let (x (list 'a 'b))
(cons x x)))
に
(eq? (car x) (cdr x))
の結果は真であり、しかもそれはが(car x)
と(cdr x)
にピアすることなく、真です。これにより、多くの共有を持つデータ構造に対して効率的な等価性テストを書くことができます。
ハスケルでも同じことが可能ですか?たとえば、次のバイナリツリーの実装を考えてみましょう。すべてのレベルで共有されているバイナリツリーの実装を考えてみましょう。 let tree = mkTree 30
のツリーを作成して、left tree
とright tree
が等しいかどうかを知りたい場合は、10億ノードを越えてデータを共有する必要があります。
ハスケルでのデータ共有を簡単に発見する方法はないと思いますが、このような問題に対処する典型的な方法は、効率的な目的で共有を検出するのが得策でしょうか?周期的なデータ構造を検出する)。
unsafe
共有を検出できるプリミティブがありますか?明示的なポインタを持つデータ構造を構築するためのよく知られた方法があるので、ポインタの等価性を比較できますか?
も参照してください。http://stackoverflow.com/questions/1717553/pointer-equality-in-haskell – Yuras
これを実行するときには、データ構造にNaNなどの値が含まれていない可能性が常に考えられます。自分自身。あなたの最適化は壊れやすいかもしれません。 – rightfold