阿格达:暧昧的名字_ == _。它可以指任何一个

时间:2014-04-28 06:06:10

标签: agda

如果我想处理提供冲突名称的包,该怎么办,例如

  module Halp where
  open import Data.String 
  open import Data.Char 
  open import Data.Bool

  foo : String -> String -> String
  foo a b  with a == b
  ... | true = "foo"
  ... | false = "bar"

导致

 Ambiguous name _==_. It could refer to any one of
  Data.String._==_ bound at ...\Data\String.agda:71,1-5
  Data.Char._==_   bound at ...\Data\Char.agda:40,1-5

有没有一个选项可以让agda弄明白我的意思是什么函数,如果存在歧义?

现在我找到了一个解决方法_==s_ = Data.String._==_

还有其他方法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用实例参数来实现此功能,Agda替代类型类。不幸的是,Agda库还没有考虑到实例参数,所以你必须自己定义Eq类和Char和String的实例:

open import Data.Bool

open import Data.Char hiding (_==_)
open import Data.String hiding (_==_)

-- The Eq type class
record Eq (A : Set) : Set₁ where
  field
    _==_ : A → A → Bool

-- Instance argument magic
open Eq {{...}}

-- Eq instance for Char
EqChar : Eq Char
EqChar = record { _==_ = Data.Char._==_ }

-- Eq instance for Bool
EqString : Eq String
EqString = record { _==_ = Data.String._==_ }

现在,您可以对_==_Char使用Bool

test : Bool
test = ('a' == 'a') ∧ ("foo" == "foo") 

要了解有关实例参数的更多信息,您可以在Agda wiki(http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.InstanceArguments)或介绍它们的论文(http://people.cs.kuleuven.be/~dominique.devriese/agda-instance-arguments/icfp001-Devriese.pdf)中了解它们。

答案 1 :(得分:1)

可悲的是,不,没有办法让Agda根据参数的类型选择其中一个。 Agda只能为构造函数解析模糊名称。

但是,有更好的方法来指定使用哪一个而不是使用_==s_

  • 您可以指定要导入全局命名空间的函数:

    open import Data.Char
      hiding (_==_)
    open import Data.String
    
    -- or the other way around
    open import Data.Char
      using (Char) -- and other stuff you might need
    open import Data.String
      using (String; _==_) -- etc.
    
  • 您可以在函数内部本地打开模块:

    import Data.Char
    import Data.String
    
    test : Type
    test = expr -- use _==_ here
      where
      open Data.String
      -- unqualified names are only available inside expr
    
  • 您可以在另一个模块中本地打开模块:

    module UsesStringEq where
      open Data.String
        using (_==_)
    
      test : Type
      test = expr -- use _==_ here
    
    open UsesStringEq public
    -- make sure that other modules can use unqualified names
    -- from UsesStringEq
    
  • 您可以使用完全限定名称:

    test : String → String → String
    test a b = if a Data.String.== b then "OK" else "Bad"
    

答案 2 :(得分:0)

  

现在我找到了一个解决方法_==s_ = Data.String._==_

您还可以在打开模块时重命名绑定:

open import Data.String renaming (_==_ to _==s_)
open import Data.Char renaming (_==_ to _==c_)