%hint 注释 imported/Dec 和自动注释?
Is the %hint annotation imported/Dec and auto annotation?
我有一个依赖于谓词 P : a -> Type 的数据类型,这意味着它的一些数据构造函数引用了一个隐式 P x 作为参数。我希望 idris 能够自动推断出这个隐式。为此,我用关键字 auto 注释了隐式,并在类型声明之前写了一个函数 isP : (x : a) -> Dec (P x) 和 %hint 注释。即,类似于:
module P
P : a -> Type
%hint
isP : (x : a) -> Dec (P x)
并在一个单独的文件中
module Main
import P
data Foo : Type where
Bar : (x : a) -> .{auto prf : P x} -> Foo
也就是说,我无法声明所述 Foo 类型的值,因为 Idris 声称它无法推断 prf。
这是因为 prf 的类型是 P x 而不是 Dec (P x) 还是因为没有导入 %hint 标志?
无论哪种情况,我怎样才能让 Idris 使用 Dec 值来尝试找到隐式?
导入了%hint
标志,如您所料,这是因为Dec (P x)
不同于P x
。
不过有个技巧,你可以使用这个数据类型:
data IsYes : prop -> Type where
SoTrue : IsYes (Yes prop)
(基本上,您定义了一个类型,其中包含给定 属性 的 Yes
)
然后你可以使用 default
而不是 auto
来检查 属性 是否成立:
data Foo : Type where
Bar : (x : a) -> .{default SoTrue prf : IsYes (isP x)} -> Foo
注意:有了这个技巧,您甚至不再需要 %hint
,您只需在编译时检查 isP
的结果。
我有一个依赖于谓词 P : a -> Type 的数据类型,这意味着它的一些数据构造函数引用了一个隐式 P x 作为参数。我希望 idris 能够自动推断出这个隐式。为此,我用关键字 auto 注释了隐式,并在类型声明之前写了一个函数 isP : (x : a) -> Dec (P x) 和 %hint 注释。即,类似于:
module P
P : a -> Type
%hint
isP : (x : a) -> Dec (P x)
并在一个单独的文件中
module Main
import P
data Foo : Type where
Bar : (x : a) -> .{auto prf : P x} -> Foo
也就是说,我无法声明所述 Foo 类型的值,因为 Idris 声称它无法推断 prf。
这是因为 prf 的类型是 P x 而不是 Dec (P x) 还是因为没有导入 %hint 标志?
无论哪种情况,我怎样才能让 Idris 使用 Dec 值来尝试找到隐式?
导入了%hint
标志,如您所料,这是因为Dec (P x)
不同于P x
。
不过有个技巧,你可以使用这个数据类型:
data IsYes : prop -> Type where
SoTrue : IsYes (Yes prop)
(基本上,您定义了一个类型,其中包含给定 属性 的 Yes
)
然后你可以使用 default
而不是 auto
来检查 属性 是否成立:
data Foo : Type where
Bar : (x : a) -> .{default SoTrue prf : IsYes (isP x)} -> Foo
注意:有了这个技巧,您甚至不再需要 %hint
,您只需在编译时检查 isP
的结果。