包装的Repa数组的可变内部类型

时间:2017-06-28 14:30:55

标签: haskell existential-type repa

我尝试在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可以在修复操作之间进行更改。大部分时间它是D(对于"延迟表示"),但是当数据首先从列表或向量创建时,它将是U(&# 34;未装箱的矢量")或V("盒装矢量")。这些用作类型提示,以帮助修复其操作。

我有没有办法隐藏r,但允许它在内部自然变化,而不会影响我的包装Tile类型的类型检查?这是RankNTypes和朋友的域名吗?我承认我不太了解它们。最清楚的是,我希望能够写下来:

foo :: Tile p a -> Tile p b -> Tile p c

其中两个Tile参数分别包含Array U DIM2 IntArray D DIM2 Int。这是一件坏事吗?

1 个答案:

答案 0 :(得分:1)

我能够通过使用delay function强制包装的Array始终包含D类型参数来解决此问题。

这也允许我将Tile保留为newtype,并为其定义Functor个实例。