Functional programming idris中隐式参数的顺序

Functional programming idris中隐式参数的顺序,functional-programming,idris,Functional Programming,Idris,我刚读了这篇文章,对MkPair的类型签名感到好奇。 我在REPL上尝试了MkPair 10,结果 (输入):无法推断Builtins.MkPair的参数B 这正是我所期望的。从它的类型签名Builtins.MkPair:{A:type}->{B:type}->(A:A)->(B:B)->(A,B),我必须先通过B(无论是隐式的还是显式的),然后才能应用A的值。 同时,我希望q10能够工作,因为它的类型是q:{A:type}->(A:A)->{B:type}->(B:B)->(A,B),这告诉我

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

(输入):无法推断Builtins.MkPair的参数B

这正是我所期望的。从它的类型签名
Builtins.MkPair:{A:type}->{B:type}->(A:A)->(B:B)->(A,B)
,我必须先通过
B
(无论是隐式的还是显式的),然后才能应用
A
的值。 同时,我希望
q10
能够工作,因为它的类型是
q:{A:type}->(A:A)->{B:type}->(B:B)->(A,B)
,这告诉我在为
A
A
应用值之前,
B
不需要任何值

但同样的消息也失败了

(输入):无法将参数B推断为Main.q

q
会发生什么变化


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

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

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

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

-- or

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