我正在尝试围绕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。渴望这是一件坏事吗?