在我正在研究的 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 爆炸:
非法多态或限定类型:容器模型在“模型(ContainerParams params)(容器模型)”的实例声明中
我不知道这个错误信息是什么意思。是否有可能以某种方式修复我的解决方案以创建一种Container
无需指定参数的类型?
编辑:我应该注意,将forall
语句移动到Container'
声明中似乎需要一堆unsafeCoerce
s,所以这似乎是一个糟糕的解决方案。
此外,我可以更改type Container
为data Container
并让事情正常工作,但这需要我重新声明Conatiner'
属于其中的所有实例,我不想这样做。我有许多遵循这种模式的不同类型,因此似乎应该有一种通用的方法来解决这个问题。