mkPair 的线性和唯一类型
Linear and Unique types with mkPair
我一直在阅读这篇文章http://edsko.net/2017/01/08/linearity-in-haskell/,作者提到可以构造一个具有唯一元素的非唯一数组,但您不能提取它们。
即
mkPair :: 1:a -> 1:b -> ω:(1:a, 1:b) -- correct but useless
mkPair x y = (x, y)
但是你不能在调用函数中读取一次元素吗?也许我错过了什么。
此外,虽然合法,但从线性的角度来看,同样的功能是非法的。但我认为这只是同一枚硬币的两个面,所以该功能不会根据角度改变合法性。
实际上,mkPair
类型错误(如博客本身所述),因为它的 return 类型允许复制结果对。因此,任何具有 a
和 b
类型的唯一值的调用者都可以制作一对,复制它,并获取四个组件(每对两个),并获得两个 [=11 类型的值=],以及两个 b
.
类型的值
这将规避 a
和 b
的线性,因此必须没有函数具有您上面显示的 mkPair
类型。
我不确定博客 post 的作者说这是正确但无用的意思。在Clean, a language which has actually implemented uniqueness types, this is not allowed due to uniqueness propagation. You can read more about that in section 9.2 of the language report。根本不存在类型 ω:(1:a, 1:b)
(在 Clean 语法中是 (*a,*b)
),因为由于唯一性传播,这实际上是 1:(1:a, 1:b)
或 *(*a,*b)
.
这可能是作者想要表达的意思,但由于缺乏理论框架,我觉得post难以阅读。
我一直在阅读这篇文章http://edsko.net/2017/01/08/linearity-in-haskell/,作者提到可以构造一个具有唯一元素的非唯一数组,但您不能提取它们。
即
mkPair :: 1:a -> 1:b -> ω:(1:a, 1:b) -- correct but useless
mkPair x y = (x, y)
但是你不能在调用函数中读取一次元素吗?也许我错过了什么。
此外,虽然合法,但从线性的角度来看,同样的功能是非法的。但我认为这只是同一枚硬币的两个面,所以该功能不会根据角度改变合法性。
实际上,mkPair
类型错误(如博客本身所述),因为它的 return 类型允许复制结果对。因此,任何具有 a
和 b
类型的唯一值的调用者都可以制作一对,复制它,并获取四个组件(每对两个),并获得两个 [=11 类型的值=],以及两个 b
.
这将规避 a
和 b
的线性,因此必须没有函数具有您上面显示的 mkPair
类型。
我不确定博客 post 的作者说这是正确但无用的意思。在Clean, a language which has actually implemented uniqueness types, this is not allowed due to uniqueness propagation. You can read more about that in section 9.2 of the language report。根本不存在类型 ω:(1:a, 1:b)
(在 Clean 语法中是 (*a,*b)
),因为由于唯一性传播,这实际上是 1:(1:a, 1:b)
或 *(*a,*b)
.
这可能是作者想要表达的意思,但由于缺乏理论框架,我觉得post难以阅读。