idris 中隐式参数的顺序

Order of implicit arguments in idris

我刚读到这篇文章 post,我对 MkPair 的类型签名感到好奇。 我在 REPL 上尝试了 MkPair 10,我得到了

(input):Can't infer argument B to Builtins.MkPair

这正是我所期望的。从它的类型签名 Builtins.MkPair : {A : Type} -> {B : Type} -> (a : A) -> (b : B) -> (A, B),我必须在为 a 应用值之前传递 B(无论是隐式还是显式)。 同时,我希望 q 10 可以工作,因为它的类型是 q : {A : Type} -> (a : A) -> {B : Type} -> (b : B) -> (A, B) 这告诉我在为 [=17] 应用值之前不需要 B 的任何值=] 和 a.

但它也失败并显示相同的消息!

(input):Can't infer argument B to Main.q

q 会怎样?

我还有一个问题。在我发现 q 都不起作用之前,我想问一下为什么 Idris 编译器更喜欢 MkPair 的签名而不是 q 的签名。 MkPair 在我看来不必要地渴望。为什么要求 B 太早了?

在没有任何上下文指导编译器的情况下,我猜 Idris 在默认情况下保持其急切的态度,并在执行自动部分应用程序之前尝试推断出现在最后一个 "explicit" 指定参数之前的所有隐式参数.

请注意,您可以通过将表达式放在适当类型的孔中来抑制此行为:

the ({b : Type} -> b -> (Nat, b)) (q 10)

-- or

r : {b : Type} -> b -> (Nat, b)
r = q 10