跳到内容
新问题

对这个项目有疑问吗?注册一个免费的GitHub帐户以打开一个问题,并联系其维护者和社区。

单击“注册GitHub”,表示您同意我们的服务条款隐私声明。我们偶尔会向您发送与帐户相关的电子邮件。

已经在GitHub上了?登录到您的帐户

特定于名称空间的导入 #581

已合并

对话

亚当甘德里
复制链接
贡献者

@亚当甘德里 亚当甘德里 评论2023年2月23日

这个建议已被接受;下面的讨论大多具有历史意义。


此建议允许将导入限制为类型或数据命名空间。此外,它澄清了
显式命名空间和相关扩展。这在很大程度上源于#270。多亏了@希思罗克@cdornan公司感谢合作!这还包括最初由@内部index修正提案#65.

提供.
具有这些更改的Work-in-progress用户指南部分.

内部index 和其他补充2提交 2023年2月23日08:45
本提案允许进口仅限于以下类型或数据命名空间。此外,它澄清了显式命名空间和相关扩展。合著人:Artyom Kuznetsov<hi@wzrd.ht>合著者:Chris Dornan<chris@chrisdornan.com>
imports,我们可以引入一个新的扩展名``NamespacedImports``。这会
更清楚地说明代码是依赖于新功能,还是依赖于旧功能
``ExplicitNamespaces``的版本已经足够了。然而,普遍的共识
似乎倾向于减少扩展的数量,而不是避免更改
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

这值得商榷:-)。一旦我们结束了正在进行的政策讨论,我们就会知道更多。但由于我们没有在GHC2023中添加ExplicitNamespaces,因此这里可能很好

复制链接
贡献者 作者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

的确。实际上,我个人倾向于添加更多的扩展,而不是向现有扩展添加功能,但我的印象是委员会宁愿减少扩展的数量。而且特定于命名空间的导入与现有的显式命名空间似乎不值得对它们进行区分。但最终我还是很高兴。

@西蒙普
复制链接
贡献者

我觉得不错。有一点:

导入合格数据。作为D的代理(代理)--已接受(导入合格的数据构造函数)

是这样吗?它将导入类型建造师代理不是吗?

实际上,对于所有这些代理示例,它将有助于提醒我们代理(使用双关语)。

我认为是这样

导入M类型(T(..))

哪里T型是代数数据构造函数,将只导入T型而不是数据构造函数。(可能带有误导性警告(..).

我认为

输入M型(T(K1,K2))

会是一个错误,因为它显式导入数据空间中的K1、K2?

举这些例子会很有用。并检查规范是否涵盖了它。

@亚当甘德里
复制链接
贡献者 作者

@西蒙普感谢您的反馈!

我觉得不错。一个缺点:

导入合格数据。作为D的代理(代理)--已接受(导入合格的数据构造函数)

是这样吗?它将导入类型建造师代理不是吗?

谢谢你发现了这一点,这确实是错误的。我已经修正了使用数据命名空间说明符。

实际上,对于所有这些代理示例,它将有助于提醒我们代理(使用双关语)。

完成。

我认为是这样

导入M类型(T(..))

哪里T型是代数数据构造函数,将只导入T型而不是数据构造函数。(可能带有误导性警告(..).

说得好。我解释了(..)在提议的变更规范中更加明确,并添加了一些示例,因为这有点令人惊讶导入M类型(T(..))不同于导入M(类型T(..))是的,我想-Wdodgy-导入将适用于此处。

我认为

输入M型(T(K1,K2))

会是一个错误,因为它显式导入数据空间中的K1、K2?

举这些例子会很有用。并检查规范是否涵盖了它。

实际上,我添加了这个示例的一个变体。我认为规范充分涵盖了这一点:

如果导入声明同时使用命名空间说明符和显式导入列表,则显式导入表可能不会提及其他命名空间说明器,也不会提及给定命名空间中不可用的标识符,否则将报告名称解析错误。

@范布吕格
复制链接

我觉得很奇怪

进口 (类型 T型(..))

还导入数据构造函数。如果使用数据种类并发出警告。出口也是如此。类似于TypeData,但用于用法方面,而不是定义

@亚当甘德里
复制链接
贡献者 作者

@范布吕格然而,情况已经如此,改变它听起来可能会导致相当痛苦的破裂。我认为,如果我们将名称空间说明符理解为紧密绑定,即。导入Foo((类型T)(..))而不是导入Foo(类型(T(..)).

@范布吕格
复制链接

范布吕格 评论2023年3月3日

这很不幸。还是值得考虑的


*``import M(data D(..))``语法有效,但没有用处,因为它不是
当前数据命名空间中的标识符可能有子项。
(我们可能会设想改变这一点,例如对于模式同义词记录字段,但是
复制链接
贡献者

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

或常规数据构造函数记录字段。。。

@金火公司
复制链接
贡献者

谢谢你写这篇文章!我支持你。

@亚当甘德里
复制链接
贡献者 作者

关于这个问题的讨论似乎已经平静下来,所以我想把它提交给委员会,@命名数据.

@命名数据 命名数据补充这个待定牧羊人建议 牧羊人需要评估提案并提出建议标签2023年5月25日
@激怒者
复制链接
贡献者

由于我现在被任命为谢泼德,我读了几遍,下面是我目前为止的想法。总的想法很好,我只是在语法方面有困难。除非我弄错了,否则允许写以下内容进行导入只有类型(类型命名空间)数据。代理

导入数据。代理类型

然而,我发现后缀符号很难阅读;在我看来,这就像一个完成了一半的句子。这个目的似乎是为了全部的类型来自该模块。

导入类型数据。代理

对我来说,它将要做什么似乎更为明显。这当然引发了一个问题

导入数据数据。代理

意思是?还有这里似乎是一个更合适的措辞,我们似乎想摆脱它。从美学角度来看,我喜欢类型和数据的长度相同,但类型和值对我来说更易读吗?也许我是唯一的一个。

@命名数据
复制链接
贡献者

我认为提案中的立场是出于导入Foo(显式,列表,共,项)但我应该让作者回答。

@亚当甘德里
复制链接
贡献者 作者

就我个人而言,我对具体的语法并不十分在意。这里的语法选择继承自#270所以@希思罗克或者其他人可能会有意见。

我认为使用后缀关键字的部分动机是出于类似的考虑进口合格岗位#190,并且还期望命名空间指定的导入将经常使用模块限定符。特别是,它允许以下内容:

进口 数据。代理类型有资格的 作为 T型
进口 数据。代理数据(代理)

关于是重用关键字还是选择更合适的关键字的问题,我认为对于导入声明本身中指定的命名空间导入,我们可以从技术上使用伪关键字,但仍然不会窃取语法。但是,对于导入/导出列表中的显式名称空间,您会怎么做?

@激怒者
复制链接
贡献者

我不太想骑自行车。我只想强调一下我的可用性问题。我在这里主要关注的是确保人们猜测大多数情况下,即使他们对haskell的大部分内容都不熟悉,但它的意思是正确的。

提案中突出给出的语法示例为:

导入合格数据。代理类型为T——仅导入类型命名空间导入合格数据。代理数据为D——仅导入数据命名空间

导入合格数据。Proxy as T(键入Proxy)--仅导入Proxy类型导入合格数据。代理为D(数据代理)--仅导入代理构造函数

语法更改为:

importdecl->“导入”[src]['safe']['qualified'][package]modid[namespace]['qualified']['as'modid][impspec]namespace->“数据”|“类型”

同样,这将允许书写

导入X类型

(我不清楚这意味着什么)。在阅读了建议之后,我知道这应该意味着“从模块X导入类型名称空间(即模块X中定义的所有类型)”,但语句与含义之间的联系不是很紧密。

导入X(键入Proxy)

另一方面,我觉得读起来不错。

作为进口合格岗位长大了,现在读起来像

导入限定为Y的X类型

是什么合格类型? 而且仍然类型是单数,但我可能会导入许多类型。

关于在显式导入列表中的使用

导入数据。代理类型(Proxy(..))--已接受:导入类型构造函数,但不导入数据构造函数导入数据。代理(类型Proxy(..))--接受:同时导入类型构造函数和数据构造函数

看起来很复杂:-/我只是把paren移动了几个字符,突然间我又导入了一个数据构造函数,或者没有。我不确定在代码评审过程中发现这一点有多容易。

如果导入具有命名空间说明符,则出现任何省略号
``(..)``将被视为仅指该命名空间中的标识符。对于
例如,``import M type(T(..))``将只导入类型级名称(因此
如果``T``是正常的代数数据类型,省略号将不表示任何内容)。

选择隐藏此评论的原因

将显示原因,以便向其他人描述此评论。了解更多信息.

省略号将不引用任何内容,但T型类型仍将被导入,对吗?(可能会说:“对于正常的代数数据类型T型只有类型T型已导入,省略号将不引用任何内容”)

@内部index
复制链接
贡献者

@安格曼这个语法怎么样:

导入数据。代理(类型..)为T导入数据。代理(数据..)为D

想法是扩展qcname文本有两种新形式:

|'类型“..”|'数据''..'

代表“所有类型”和“所有数据”。

@米歇尔普吉
复制链接
贡献者

如果我们有导入数据。代理(类型…)为T我希望能够写作导入数据。代理(…)作为T也!那怎么办导入数据。代理作为T隐藏(数据…)?

@内部index
复制链接
贡献者

@米歇尔普吉我不知道你是否写信。。。而不是..但我们必须坚持后者,因为

  1. ..是保留语法,。。。是用户定义的运算符
  2. ..已用于出口/进口项目,例如。导入前奏曲(Bool(..))

至于你的实际建议,我觉得它们很合理(也就是说,它们会使建议的语法更加规则),但我无法为它们提供实际的用例,因为有更简单的方法来编写它们。

  1. 导入数据。代理(..)为T等于导入数据。代理为T,即只需移除(..)总共
  2. 导入数据。代理作为T隐藏(数据..)等于导入数据。代理(类型..)为T,即使用相反的命名空间说明符

我倾向于省略那些不必要的添加内容,以保持提案简单,但最终取决于@亚当甘德里我也没有强烈的感觉。

@激怒者
复制链接
贡献者

@内部index这看起来并不太糟糕,而且基本上与我们已有的一致,重用..表示通配符。

导入数据。代理为T(类型..)导入合格数据。代理为T(类型..)导入数据。代理被限定为T(类型..)

现在这两个怎么样:

导入数据。代理类型(代理(..))--已接受:导入类型构造函数,但不导入数据构造函数导入数据。代理(类型Proxy(..))--接受:同时导入类型构造函数和数据构造函数

所以我们现在有

导入数据。代理(Proxy)导入数据。代理(代理(..))导入数据。代理(类型..)导入数据。代理(数据..)导入数据。Proxy(类型Proxy)--已接受:导入类型构造函数,但不导入数据构造函数导入数据。代理(类型Proxy(..))--接受:同时导入类型构造函数和数据构造函数

只有?

对不起,如果我对您建议的语法,即提案中的导入语法有点混淆的话。

@内部index
复制链接
贡献者

@安格曼这是明细表。

今天我们有:

导入数据。代理--导入所有内容导入数据。代理(Proxy)——1。仅导入类型构造函数导入数据。代理(键入Proxy)--2。仅导入类型构造函数导入数据。代理(模式代理)--3。仅导入数据构造函数导入数据。代理(Proxy)——4。同时导入类型和数据构造函数导入数据。代理(…))--5。同时导入类型和数据构造函数导入数据。代理(键入Proxy(Proxy))--6。同时导入类型和数据构造函数导入数据。代理(键入Proxy(..))--7。同时导入类型和数据构造函数

我的建议是:

  1. 将(3)替换为导入数据。代理(数据代理),即使用数据关键字而不是图案
  2. 允许这两个新表单:
    导入数据。代理(类型..)--8。导入所有类型构造函数导入数据。代理(数据..)--9。导入所有数据构造函数和值绑定

所有9种形式也与有资格的作为别名,但这些交互并不是新的,并且与提议的更改是正交的。

@内部index
复制链接
贡献者

内部index 评论2023年6月5日

我也不喜欢(6)和(7),因为导入项的前缀是类型但同时导入类型构造函数和数据构造函数。它们始终可以分别替换为(4)和(5)。我们可能会反对使用它们,或者至少添加一个警告。

@激怒者
复制链接
贡献者

@内部index虽然我在概念上同意

所有9个表单都与限定和as Alias交互,但这些交互并不是新的,并且与提议的更改是正交的。

我认为仍然值得确保与该语法的交互不会导致难以理解或混淆的语法。这就是我长大的原因

导入限定为Y的X类型

尽管如此,我更喜欢您建议的语法。

@内部index
复制链接
贡献者

好的,为了列出所有的交互,我们最终得到了这些组合:

将合格的X(类型..)导入为Y将限定的X(数据..)导入为Y导入限定为Y的X(类型..)导入限定为Y的X(数据..)将X(类型..)导入为Y将X(数据..)导入为Y导入限定的X(类型..)导入合格的X(数据..)导入X(类型..)合格导入X(数据..)合格导入X(类型..)导入X(数据..)

@米哈伊尔普的第一个建议,我们还得到

将限定的X(..)导入为Y导入限定为Y的X(..)将X(..)导入为Y导入限定的X(..)导入X(..)合格导入X(..)

而且有@米歇尔普吉的第二个建议,我们还得到

将限定的X作为Y隐藏导入(键入..)将限定的X导入为Y隐藏(数据..)导入限定为Y隐藏的X(键入..)导入限定为Y的X隐藏(数据..)将X作为Y导入隐藏(键入..)将X作为Y导入隐藏(数据..)导入限定的X隐藏(类型..)导入限定X隐藏(数据..)导入X限定隐藏(类型..)导入X限定隐藏(数据..)导入X隐藏(键入..)导入X隐藏(数据..)

@激怒者
复制链接
贡献者

@亚当甘德里 @希思罗克 @cdornan公司作为提案的作者,你对此有何看法?

@金刚砂
复制链接
贡献者 作者

我喜欢这个主意,谢谢你的建议@int索引! 特别是它消除了导入数据。代理(键入Proxy(..))导入数据。代理类型(代理(..))以及各种角落案例导入数据。代理数据(数据代理)这些都是多余的。此外导入数据。代理(类型..)希望对于以前没有见过它的用户来说,它应该相当容易理解。

我倾向于不允许导入M(..)因为它是完全多余的。实施可以始终建议导入M在错误消息中。另一方面,导入M隐藏(类型..)看起来比较自然,在某些情况下可能有用,所以我建议允许这样做。

此更改确实模糊了显式导入列表或显式导出列表的概念。大概吧-缺少导入列表不会为导入M(类型..,数据..)尽管它本质上等同于导入M(和类似的-错过出口清单). 但我认为这没关系。

如果我们一致认为这是正确的方法,我很乐意重写使用这种语法的建议。其他人对此有何感想?

@西蒙普
复制链接
贡献者

我稍微喜欢新提出的语法。谢谢@内部index

@希思罗克
复制链接
贡献者

我同意建议的语法。

这将更改建议以使用导入M(类型..)而不是导入M类型感谢弗拉迪斯拉夫·扎维亚洛夫的建议。
@亚当甘德里
复制链接
贡献者 作者

我现在已经修改了提案,以考虑到新的语法,我对新的设计非常满意。谢谢@内部index为了这个建议!在这样做的时候,我想到了一些事情:

  • 现在自然会允许类型。。数据。。显示为子导入项,例如:

    进口 M(M)(C类(类型 ..))

    如果C类是一个在两个命名空间中都有许多子类的类(例如,关联的类型和方法)。因此,我倾向于允许这样做。

  • 我们现在可以导出单个命名空间中的所有名称:

    模块 M(M)(类型..)哪里 。。。
  • 现在,我们可以稍微冗余地导入这两个名称空间:

    进口 M(M)(类型..中。。,数据..)

@命名数据 命名数据补充等待委员会审查 委员会需要评估提案并做出决定和已删除待定牧羊人建议 牧羊人需要评估提案并提出建议标签2023年7月3日
@命名数据 命名数据合并提交ddfb8a1型进入之内 ghc提案:主人 2023年7月15日
@命名数据 命名数据补充认可的 委员会决定接受这个建议和已删除等待委员会审查 委员会需要评估提案并做出决定标签2023年7月15日
@法德吉
复制链接
贡献者

法德(phadej) 评论2023年7月16日

大概吧-缺少导入列表不会为导入M(类型..,数据..)

我建议大家继续努力。非常重要的一点是-缺少导入列表是查找在依赖项添加新绑定时可能导致问题的导入。沉默的方式-缺少导入列表不应该是改变导入M进入之内导入M(数据..),但要显式拼写导入(或导入限定)。

编辑:出口清单同上。维护人员应该有一种方法来确保他们的导出列表是明确的(这样重构就不会意外地引入新的绑定——如果不进行彻底的更改,就无法删除这些绑定)。

免费注册 在GitHub上加入此对话.已经有帐户了吗?登录以发表评论
标签
认可的 委员会决定接受这个建议
开发

成功合并此请求可能会解决这些问题。

还没有