【问题标题】:Purpose of anonymous modules in AgdaAgda 中匿名模块的用途
【发布时间】:2020-08-07 09:45:23
【问题描述】:

进入 Agda 标准库的根目录,并发出以下命令:

grep -r "module _" . | wc -l

产生以下结果:

843

每当我遇到这样的匿名模块(我假设这就是它们的名称)时,我完全不知道它们的用途是什么,尽管它们明显无处不在,也不知道如何使用它们,因为根据定义,我无法访问他们的内容使用他们的名字,虽然我认为这应该是可能的,否则他们甚至允许他们被定义是没有意义的。

维基页面:

https://agda.readthedocs.io/en/v2.6.1/language/module-system.html#anonymous-modules

有一个名为“匿名模块”的部分实际上是空的。

有人能解释一下匿名模块的用途是什么吗?

如果可能,任何强调此类模块定义相关性以及如何使用其内容的示例将不胜感激。


以下是我想出的可能的想法,但似乎没有一个是完全令人满意的:

  1. 它们是一种在 Agda 文件中重新组合主题相同的定义的方法。
  2. Agda 在使用它们提供的功能时以某种方式推断出它们的名称。
  3. 他们的内容只是为了在他们的 englobing 模块中可见/使用(有点像 private 块)。

【问题讨论】:

    标签: module agda


    【解决方案1】:

    匿名模块可用于简化共享一些参数的一组定义。示例:

    open import Data.Empty
    open import Data.Nat
    
    <⇒¬≥ : ∀ {n m} → n < m → n ≥ m → ⊥
    <⇒¬≥ = {!!}
    
    <⇒> : ∀ {n m} → n < m → m > n
    <⇒> = {!!}
    
    module _ {n m} (p : n < m) where
    
      <⇒¬≥′ : n ≥ m → ⊥
      <⇒¬≥′ = {!!}
    
      <⇒>′ : m > n
      <⇒>′ = {!!}
    

    Afaik 这是匿名模块的唯一用途。当module _ 范围关闭时,您不能再引用该模块,但您可以引用它的定义,就好像它们根本没有在模块中定义一样(而是使用额外的参数)。

    【讨论】:

    • 感谢您的回答。虽然我很高兴我终于知道这是怎么一回事,但我有点失望,并且觉得这有点像 hack,尤其是与 Agda 中下划线的其他用法相比。能够在没有前缀且没有事先打开模块的情况下引用随附的定义感觉很奇怪。作为旁注,我注意到在标准库中,出现过这样一个没有参数的模块,因此这一定是一个错误或某种审美选择。
    • 还有另一个用例:在本地打开 _ 模块内的模块(即不为 _ 模块之后的所有内容打开模块)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2014-09-30
    • 2012-03-15
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多