如果发生名称冲突,则优先考虑当前模块中的函数
prioritize functions from current module if name collision occurs
如果我想在 Main
模块中定义一个 show
函数,我必须像这样明确地在模块名称前添加:
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
,因为我主要在我的内部使用它模块。
首先,您只需要在递归函数调用前添加 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'
如果我想在 Main
模块中定义一个 show
函数,我必须像这样明确地在模块名称前添加:
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
,因为我主要在我的内部使用它模块。
首先,您只需要在递归函数调用前添加 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'