如果发生名称冲突,则从当前模块中优先化函数

时间:2018-02-04 04:04:15

标签: idris

如果我想在show模块中定义Main函数,我必须像这样明确地添加模块名称:

module Main

Main.show : Nat -> String
Main.show Z = ""
Main.show (S n) = "I" ++ (Main.show n)

否则我收到错误Can't disambiguate name: Main.show, Prelude.Show.show。有没有办法告诉Idris我的当前模块有优先权,以避免在任何地方写Main.?我可以写Prelude.Show.show来引用我的模块之外的实现,但我想写show来引用Main.show,因为我主要是在我的内部工作模块。

1 个答案:

答案 0 :(得分:1)

首先,您只需在递归函数调用前加Main.,其中Idris不知道您的意思是Main.show还是Prelude.Show.show

show : Nat -> String
show Z = ""
show (S n) = "I" ++ (Main.show n)

但是没有办法确定功能的优先顺序。我想这是理智的,因为否则你需要跟踪所有命名空间中的所有名称才能正确理解代码。但是,有%hide <func>指令删除对函数的访问权限。要在其他情况下仍然可以访问它,您可以先重命名它:

module Main

PLshow : Show ty => ty -> String
PLshow = Prelude.Show.show

%hide Prelude.Show.show

show : Nat -> String
show Z = ""
show (S n) = "I" ++ (show n)

foo : String
foo = PLshow 'a'