如果我想在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
,因为我主要是在我的内部工作模块。
答案 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'