【发布时间】:2017-06-18 13:21:49
【问题描述】:
我正在尝试使用类型级别的权限系统,并且我正在尝试禁止分配并非来自同一“来源”的值,即:
data A = A { a :: Value, b :: Value }
modify :: A -> A
modify (A v) = A $ v { a = v.a } -- should work
modify (A v) = A $ v { a = v.b } -- should *NOT* work
我已经尝试过 N 级(或暗示性?)类型:
type Value = forall a. Value a ...
但上述两种情况是一致的。如果我约束a:
type Value = forall a. Unique a => Value a ...
两种情况都没有。有没有办法实现这样的目标?在 Haskell 中可以吗?
(注意:Value 构造函数不会公开,即无法创建独立的Value。)
【问题讨论】:
-
这不会破坏参照透明度吗?
-
给
Value添加一个幻像类型参数,并在A内部用两种不同的类型实例化它;例如使用TypeLits:data A = A (Value 1) (Value 2)。这基本上无非是拥有两个(或k代表k : Nat)不同的同构Value类型。 (顺便说一句:你说你尝试的第一件事被称为“存在”类型,而不是“指示性”或“等级-N”,它们都是完全不同的东西)。
标签: haskell purescript unification impredicativetypes rank-n-types