我尝试在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 Int
和Array D DIM2 Int
。这是一件坏事吗?
答案 0 :(得分:1)
我能够通过使用delay
function强制包装的Array
始终包含D
类型参数来解决此问题。
这也允许我将Tile
保留为newtype
,并为其定义Functor
个实例。