Haskell 使用mkPair的线性和唯一类型

Haskell 使用mkPair的线性和唯一类型,haskell,uniqueness-typing,Haskell,Uniqueness Typing,我在这里通读了这篇文章,作者提到可以用唯一元素构造一个非唯一数组,但不能提取它们 即 但是您不能在调用函数中读取一次元素吗?也许我错过了什么 此外,虽然合法,但从线性角度来看,同样的功能是非法的。但我认为这只是一个硬币的两面,因此函数不会根据透视图而改变合法性。实际上,mkPair是类型错误的(正如博客本身所述),因为它的返回类型允许复制结果对。因此,任何具有唯一值类型a和b的调用方都可以创建一对,复制它,并获取四个组件(每对两个),然后获得两个a类型的值和两个b类型的值 这将绕过a和b的线性关

我在这里通读了这篇文章,作者提到可以用唯一元素构造一个非唯一数组,但不能提取它们

但是您不能在调用函数中读取一次元素吗?也许我错过了什么


此外,虽然合法,但从线性角度来看,同样的功能是非法的。但我认为这只是一个硬币的两面,因此函数不会根据透视图而改变合法性。

实际上,
mkPair
是类型错误的(正如博客本身所述),因为它的返回类型允许复制结果对。因此,任何具有唯一值类型
a
b
的调用方都可以创建一对,复制它,并获取四个组件(每对两个),然后获得两个
a
类型的值和两个
b
类型的值


这将绕过
a
b
的线性关系,因此不能有任何函数具有上面显示的
mkPair
类型。

我不确定博客作者说这是正确的但没有用的意思。在实际实现了唯一性类型的语言中,由于唯一性传播,这是不允许的。有关这方面的更多信息,请参阅的。根本不存在类型
ω:(1:a,1:b)
(在干净的语法中是
(*a,*b)
),因为由于唯一性传播,这实际上是
1:(1:a,1:b)
*(*a,*b)


这可能是作者想要表达的,但由于缺乏理论框架,我觉得这篇文章很难阅读。

顺便说一句,我想你混淆了两个例子。上面的功能在博客中标记为“不正确”。此功能在博客文章中出现两次;第一次用的是“正确但无用”,第二次用的是“不正确”。要么我误解了作者想说的关于这个函数的内容,要么他们在“正确但无用”的情况下包含了错误的函数。据我所知,这个函数确实是不正确的,
(,)
最一般的类型应该是
n:a->m:b->(min-nm):(n:a,m:b)
(至少据我所知),它应该拒绝
mkPair
定义(因为
ω/=min 1 1
)@user2407038,函数出现两次:一次在唯一性类型下,另一次在线性类型下。我的理解是:如果你有一个函数mkPair,并将两个唯一的类型传递给它,唯一的结果是你能得到一个唯一的对?此时,调用函数可以只读取一次从mkPair返回的对,对吗?@tesserakt唯一性是类型的属性,而不是函数的属性。类型
ω:(1:a,1:b)
根本不存在,因此较大的类型
1:a->1:b->ω:(1:a,1:b)
也不存在。您可以定义一个函数
1:a->1:b->ω:(ω:a,ω:b)
,例如
f\uu=(未定义,未定义)
。当然,您不允许将唯一类型升级为非唯一类型(
fxy=(x,y)
,具有相同的签名)。@tesserakt具体地说,“如果您有一个函数并将两个唯一类型传递给它,您唯一能得到的结果就是一个唯一的对”-我认为您的想法是正确的,但是像
1:a->1:b->1:a
或者
1:a->1:b->Int
这样的输入当然是可能的。如果要返回参数的元组,它必须是唯一的,并且具有唯一的元素。因此,mkPair必须具有类型1:(1:a,1:b),对吗?@tesserakt是的,这应该是它的返回类型。我们不能把第一个1改成ω。
mkPair :: 1:a -> 1:b -> ω:(1:a, 1:b) -- correct but useless
mkPair x y = (x, y)