18

再帰的な ADT がある場合

data MyType = A | B | C MyType | D MyType MyType

のインスタンスに次のようなものがMyType含まれているかどうかを判断する関数を作成できます。A

hasA :: MyType -> Bool
hasA A = True
hasA B = False
hasA (C x) = hasA x
hasA (D x y) = (hasA x) || (hasA y)

これは非環式のインスタンスでは機能しますが、環式構造では停止しません。

let x = C x in hasA x

代わりに、この例では を返す必要がありFalseます。他の場合 ( を使用D) では、 を返す代わりに誤って停止しませんでしたTrue

hasAでは、問題は、循環構造で機能するような関数を最も簡単に作成するにはどうすればよいかということです。Racketには の形式で特に優れた機能があり、追加のコードをほとんど使用せずに、上記の例のようにdefine/fix関数hasAを意図したとおりに動作させ、構造を返すことができます。FalseHaskellで似たようなことをする方法はありますか? 拡張機能はありますか?

編集:define/fix実際には、Matt Might によって作成されたマクロであり、組み込み機能ではなく、Racket のメタプログラミング機能を利用していることがわかりましたが、これにより、Racket の優れた機能が失われることはありません。このマクロは Haskell で再現できるのでしょうか?

4

1 に答える 1

11

Hackage で検索するキーワードは、観察可能な共有です。これらの結果のdata-reifyパッケージは、特に関連性が高いように見えます。

data-reify[sic] 再帰構造を明示的なグラフに変換する機能を提供しました。型クラスのインスタンスを介して、多くの (暗黙的または明示的に) 再帰的なデータ構造にこの機能を与えることができます。これにより、監視可能な共有に Ref を使用する代わりの方法が提供されます。

于 2013-10-13T00:44:35.173 に答える