私が取り組んでいる HLearn ライブラリには、次のようなコンテナー データ型があります。
data (Model params model) => Container' params model = Container'
{ baseparams :: params
, basemodel :: model
}
params
問題は、とmodel
が互いに一意に決定されるため、この型は使いにくいということです。
class Model params model | params -> model, model -> params
したがって、型を指定するときに両方を指定する必要がなければ、はるかに便利です。コンパイラは自動的にそれを行うことができるはずです。
この問題を解決するための私のアイデアは、存在量化を使用する型エイリアスを作成することでした:
type Container model = forall params . (Model params model) => Container' params model
しかし、これはうまくいきません。通常のようにインスタンスを作成するとContainer'
、すべて正常に動作します。
data ContainerParams params = ContainerParams params
instance (Model params model) => Model (ContainerParams params) (Container' params model)
しかし、私のContainer
タイプを使用すると:
instance (Model params model) => Model (ContainerParams params) (Container model)
ghc が爆発する:
不正なポリモーフィックまたは修飾された型: コンテナー モデル `Model (ContainerParams params) (Container model)' のインスタンス宣言内
このエラー メッセージの意味がわかりません。Container
パラメータを指定する必要のない型を作成するために、私のソリューションを何らかの形で修正することは可能ですか?
forall
編集:ステートメントをContainer'
宣言に移動するには、たくさんのunsafeCoerce
s が必要なように思われるので、それは悪い解決策のように思われることに注意してください。
また、 を変更して機能type Container
させることもできますdata Container
が、これには一部であるすべてのインスタンスを再宣言する必要がConatiner'
あり、そうしたくありません。私はこのパターンに従うさまざまなタイプを持っているので、この問題を解決する一般的な方法があるはずです。