Functional programming idris中隐式参数的顺序
我刚读了这篇文章,对MkPair的类型签名感到好奇。 我在REPL上尝试了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 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