我一直在阅读这篇文章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)
但你不能在调用函数中读取一次元素吗?也许我错过了什么。
此外,虽然合法,但从线性角度来看,同样的功能是非法的。但我认为这些只是同一枚硬币的两面,因此根据视角,该功能不会改变合法性。
答案 0 :(得分:1)
实际上,mkPair
是错误类型的(正如博客本身所述),因为它的返回类型允许复制结果对。因此,任何具有a
和b
类型的唯一值的调用者都可以成对,复制它,并获取四个组件(每对中有两个),并获得两个类型{{1}的值}和两个类型为a
的值。
这会绕过b
和a
的线性,因此必须没有函数的类型与上面显示的b
类型相同。
答案 1 :(得分:1)
我不确定博客文章的作者在说这是正确但没用的时候意味着什么。在Clean中,实际实现了唯一性类型的语言,由于唯一性传播,不允许。您可以在section 9.2的language report中详细了解相关信息。根本不存在类型ω:(1:a, 1:b)
(在Clean语法中为(*a,*b)
),因为由于唯一性传播,这实际上是1:(1:a, 1:b)
或*(*a,*b)
。
这可能是作者试图表达的内容,但由于缺乏理论框架,我觉得这篇文章难以阅读。