当前位置: 首页 > 知识库问答 >
问题:

线性类型如何防止这种“复制”的实现?

范浩宕
2023-03-14

我最近读了Tweag的帖子。关于线性类型是表达参数的有用工具,只(准确地)使用一次。他们提出了以下例子:

dup :: a ⊸ (a,a)
dup x = (x,x)

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

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

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

共有1个答案

申屠秦斩
2023-03-14

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

你可以查看x⊸ y作为x的同义词-

你链接的论文给出了正确的语义学。参见第3.1节,图2-对应于let的键入规则。标准的键入判断x: T被推广为x:_{q}T(q应该是下标)。在现有的哈斯克尔类型语义学中,术语用其类型来注释。在对类型系统的拟议扩展中,术语用其类型和多重性进行注释。

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

 类似资料:
  • 本文向大家介绍jQuery如何防止这种冒泡事件发生,包括了jQuery如何防止这种冒泡事件发生的使用技巧和注意事项,需要的朋友参考一下 冒泡事件就是点击子节点,事件会向上传递,最后触发父节点,祖先节点的点击事件。 html代码部分: jQuery代码如下: 当点击span时,会触发div与body 的点击事件。点击div时会触发body的点击事件。 如何防止这种冒泡事件发生呢?修改如下:     

  • 我正在使用jdb dubugger,它的问题是在每个捕获到的异常上都会停止,尽管我没有执行任何捕获。。。。声明。在类加载过程中,有数百个: 发生异常:java。io。FileNotFoundException(uncaught)“thread=thread-2-EmulatorEngine”,sun。其他。URLClassPath$JarLoader。ensureOpen(),行=634 bci=

  • 问题内容: 我有一个可用作地图键的类型,但我想防止这种情况的发生。我以为如果该类型包含一个私有成员,则其他软件包将无法实现,但这似乎仍然可行。使类型不能用作映射键的最佳方法是什么? 问题答案: 我认为禁止将类型用作键没有任何好处。它只是一个可能会使用或可能不会使用的选项,其类型不会因为您禁止将其用作地图键而变得更好,更小或更快。 但是,如果您想这样做:规格:地图类型: 该比较操作符 ==和=必须为

  • 问题内容: 我有多态类型,并且可以从JSON反序列化为POJO。实际上,我遵循这里的文档。将POJO序列化为JSON时,我得到了不需要的属性,特别是逻辑类型名称。 当Jackson序列化为JSON时,它提供了我不想公开的类型信息。 我可以以某种方式防止这种情况吗?反序列化时我只想忽略。 问题答案: 一个简单的解决方案是将和配置移至,然后仅注册进行反序列化。

  • 问题内容: 我正在尝试使用AngularJS渲染一些SVG,但无法动态更改svg元素的视图框。 Angular呈现“ viewbox”属性,但浏览器需要“ viewBox”属性。所以结果是: 如何获得期望的结果: 谢谢。 问题答案: 查看此指令是否有效: HTML: Plnkr。您需要“检查元素”或“查看源代码”才能看到svg标签。 @Niahoo发现,如果包括jQuery,这是可行的(他对此文章

  • 问题内容: 我正在用来创建用户并处理身份验证。 当我尝试通过方法通过简单登录创建新用户时,如果已经使用了电子邮件地址,firebase不会创建该用户。但是,在创建用户并将其用作密钥之后,我还用于将创建的用户保存到我的Firebase中。尝试写入数据库时​​,即使用户名不是唯一的,firebase也会保存记录,因为简单登录只需要电子邮件和密码。因此,当用户名不用作用户对象的密钥时,如何验证其唯一性?