我正在尝试围绕repa编写一个瘦包装器,以为我正在做的一些特定领域的工作提供额外的约束。我有类型:
newtype Tile p r a = Tile { _array :: Array r DIM2 a }
从哪里来。Array
_ repa
我想隐藏它,r
因为它会为类型签名添加噪音并产生Tile
泄漏的抽象:
newtype Tile p a = Tile { _array :: Array ? DIM2 a } -- what should `?` be?
不幸的是,这r
可能会在 repa 操作之间发生变化。大多数时候它是D
(对于“延迟表示”),但是当第一次从列表或向量创建数据时,它将是U
(“未装箱的向量”)或V
(“装箱的向量”)。这些用作类型提示以帮助 repa 优化其操作。
有没有办法让我隐藏r
我想要的,但允许它在内部自然变化而不影响我的包装器类型的Tile
类型检查?这是RankNTypes
和朋友的域名吗?我承认我不太了解他们。最清楚的是,我希望能够写:
foo :: Tile p a -> Tile p b -> Tile p c
其中两个Tile
参数分别包含(例如)anArray U DIM2 Int
和Array D DIM2 Int
。渴望这是一件坏事吗?