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这些注释应该是答案;)