【问题标题】:Is the %hint annotation imported/Dec and auto annotation?%hint 注释是否导入/Dec 和自动注释?
【发布时间】:2019-09-12 01:35:50
【问题描述】:

我有一个依赖于谓词 P : a -> Type 的数据类型,这意味着它的一些数据构造函数引用了一个隐式 P x 作为参数。我希望 idris 能够自动推断出这个隐含的。为此,我使用关键字 auto 对隐式进行了注释,并在类型声明之前编写了一个带有 %hint 注释的函数 isP : (x : a) -> Dec (P x)。即,类似:

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 值来尝试查找隐式?

【问题讨论】:

    标签: annotations idris dependent-type


    【解决方案1】:

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

    【讨论】:

    • 是的,它构建了一个 Foo,我的错字不好。已编辑。
    • 当我尝试此解决方案时,在尝试定义类似于以下内容的 Bar 时出现类型错误: IsYes (Yes prop) (SoTrue 的类型) 和 IsYes (isP x) 之间的类型不匹配 (预期类型)。 Idris 检查了我的函数 isP。
    • 这应该意味着isP x不能被评估为是。如果您将isP 定义为isP = Yes ?placeholder_1,您能否检查它是否编译?
    • 否,将 isP 的主体替换为 Yes ?h 仍然会产生相同的错误。
    • 通过使 isP 成为公共导出而不是简单的导出解决了问题
    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多