【发布时间】:2017-08-04 08:48:34
【问题描述】:
我最近阅读了the post on Tweag.IO,关于线性类型是一种有用的工具,用于表达仅(完全)使用一次的参数。他们提供了以下示例:
dup :: a ⊸ (a,a)
dup x = (x,x)
现在,也许我误解了这个想法,但为什么不能通过以下方式规避:
dup' :: a ⊸ (a,a)
dup' x = (y,y)
where
y = x
文章特别提到了论据。这是否也扩展到函数中的所有绑定?
【问题讨论】:
-
我觉得这篇文章几乎没有解释底层语义——只是举例说明如何使用这种技术(公平地说,这可能是博客文章的一种很好的格式)。您可以将
x ⊸ y视为1 x -> y的同义词,这是一个常规箭头,其域为1 x,表示变量a :: 1 x只使用了一次。通过类型推断,在您的第二个示例中,y获得推断类型1 a,因为y = x和x :: 1 a。这扩展到所有自然数和无穷大,并且是一个很好的概括 - 常规箭头x -> y可以读作ω x -> y。 -
更多详情请参阅trac上的提案。
-
哦,您链接的论文正确地给出了语义。参见第 3.1 节,图。 2 - 对应于
let的打字规则。但是,请注意,在那篇论文中,let构造始终在let-bound 变量上包含显式类型签名。使用那篇论文的语法,您的第二个程序(实际上,大多数 Haskell 程序!)甚至在语法上都不是有效的。但重点是,论文中将标准的打字判断x : T推广到x :_{q} T(即q应该是下标)。所以一个术语用它的类型和它的多样性来注释。 -
@user2407038 那些 cmets 应该是一个答案 ;)
标签: haskell types linear-types