我与一个类型级权限的系统试验,我试图以禁止不从相同的“源”来源值的分配,即:不允许转让
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(或impredicative?)类型:
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' for'k:Nat')不同的,同构的'Value'类型。 (另外:你说的第一件事你称之为'existensial'类型,而不是'impredicative'或'rank-N',它们都是完全不同的东西)。 – user2407038