Haskell 线性类型如何防止这种执行;重复;?

Haskell 线性类型如何防止这种执行;重复;?,haskell,types,linear-types,Haskell,Types,Linear Types,我最近读到关于线性类型是一个非常有用的工具,用于表示只(准确地)使用一次的参数。它们提供了以下示例: dup :: a ⊸ (a,a) dup x = (x,x) 现在,也许我误解了这个想法,但为什么不能用以下方法来规避呢: dup' :: a ⊸ (a,a) dup' x = (y,y) where y = x 这篇文章特别提到了论点。这是否也扩展到了函数中的所有绑定?我觉得这篇文章几乎没有解释底层语义,只是举例说明如何使用这种技术。公平地说,这可能是一个很好的博客文章格式 您

我最近读到关于线性类型是一个非常有用的工具,用于表示只(准确地)使用一次的参数。它们提供了以下示例:

dup :: a ⊸ (a,a)
dup x = (x,x)
现在,也许我误解了这个想法,但为什么不能用以下方法来规避呢:

dup' :: a ⊸ (a,a)
dup' x = (y,y)
  where
    y = x

这篇文章特别提到了论点。这是否也扩展到了函数中的所有绑定?

我觉得这篇文章几乎没有解释底层语义,只是举例说明如何使用这种技术。公平地说,这可能是一个很好的博客文章格式

您可以查看
x⊸ y
作为
1x->y
的同义词,它是一个规则箭头,其域是
1x
,表示变量
a::1x
只使用一次。通过类型推断,在第二个示例中,
y
获取推断的类型
1a
,因为
y=x
x::1a
。这延伸到所有自然数和无穷大。此外,规则箭头
x->y
可以被读取为
ωx->y
,其中
ω
为无穷大

您链接的对象正确地给出了语义。参见第3.1节,图2-与
let
相对应的键入规则。标准的打字判断
x:T
被推广到
x:{q}T
(q应该是一个下标)。在现有的Haskell类型语义中,术语是用其类型进行注释的。在建议的类型系统扩展中,术语用其类型和多重性进行注释


但是,请注意,在那篇文章中,let构造总是在let绑定变量上包含显式类型签名。根据那篇文章的语法,你的第二个程序(事实上,大多数Haskell程序!)甚至在语法上都是无效的。但我声称(没有证据)不难看出如何将这样一个类型系统推广到一个更能让人想起当前Haskell类型系统的系统。请参阅GHC上的提案,了解更多关于这一点的详细信息。

我觉得这篇文章几乎没有解释基本语义,只是举例说明如何使用这种技术(公平地说,这可能是一种很好的博客文章格式)。您可以查看
x⊸ y
作为
1x->y
的同义词,它是一个规则箭头,其域是
1x
,表示变量
a::1x
只使用一次。通过类型推断,在第二个示例中,
y
获取推断的类型
1a
,因为
y=x
x::1a
。这扩展到了所有的自然数和无穷大,这是一个很好的推广-正则箭头
x->y
可以理解为
ωx->y
。有关更多细节,请参阅上的建议。哦,你链接的论文给出了正确的语义。参见第3.1节,图2-与
let
相对应的键入规则。但是,请注意,在那篇文章中,
let
构造总是在
let
绑定变量上包含显式类型签名。根据那篇文章的语法,你的第二个程序(事实上,大多数Haskell程序!)甚至在语法上都是无效的。但问题是,在本文中,标准类型判断
x:T
被推广到
x:{q}T
(即
q
应该是一个下标)。所以一个术语用它的类型和多重性进行注释。@user2407038这些注释应该是答案;)