1

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

4

1 回答 1

1

我能够通过使用函数Array强制包装始终包含类型参数来解决这个问题。Ddelay

这也允许我保留Tile为 anewtypeFunctor为它定义一个实例。

于 2017-06-28T14:54:17.217 回答