如果我想处理提供冲突名称的包,该怎么办,例如
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._==_
。
还有其他方法吗?
答案 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_)