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
我刚读到这篇文章 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