如果发生名称冲突,则优先考虑当前模块中的函数

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'