%hint注释是否已导入/ Dec和自动注释?

时间:2019-04-22 21:43:54

标签: annotations idris dependent-type

我有一个依赖于谓词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值尝试查找隐式?

1 个答案:

答案 0 :(得分:2)

%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的结果即可。