データ構造のトラバースに関する以前の質問に関連して、ユニプレートパッケージと一緒に使用すると、コードを汎用化するのに問題があります。私はLanguage.Exts.Annotated.Syntaxモジュールのデータ構造を扱っています。これらはすべてtypeパラメーターを持つ汎用l
です。これl
はツリー全体で同じです。
私が書いているコードの種類は次のようなものです。
doInt :: Child1 l -> Child1 l
doInt (Child1 l n) = Child1 l (n + 1)
doString :: Child2 l -> Child2 l
doString (Child2 l (_:s)) = Child2 l ('j' : s)
replace :: Data l => Parent l -> Parent l
replace = transformBi doInt
. transformBi doString
このコードは、最後の2行の両方で次のエラーを生成します。
Ambiguous type variable `l' in the constraint: `Data l' arising from a use of `transformBi' at Test.hs:31:10-52 Probable fix: add a type signature that fixes these type variable(s)
このコードがあいまいである理由がわかります。aをtransformBi
受け入れて;に変換します。私の場合、inとinの間にリンクはありません。私が見ないのはそれを修正する方法です。のような型制約を追加しようとしましたが、同じエラーが発生します。これを行うと、まるで新しいものを紹介しているようです。(to -> to)
from
from
l
Child1 l
l
Parent l
transformBi (doInt :: Child1 l -> Child1 l)
l
、およびに同じl
ものを使用していることをコンパイラに伝えるにはどうすればよいですか?replace
transformBi doInt
transformBi doString
編集: これは私がしていることを示す完全なプログラムです。GHC 6.10.4では、このプログラムはコンパイルに失敗し、上記のエラーが発生します。