idris 中类型计算函数结果的模式匹配

Pattern matching on the result of type computing functions in idris

考虑以下片段:

import Data.List

%default total

x : Elem 1 [1, 2]
x = Here

type : Type
type = Elem 1 [1, 2]

y : type
y = Here

这给出了错误:

检查 y 的右侧时: 类型不匹配 Elem x (x :: xs) (这里的类型) 和 iType(预期类型)

查询到y的类型是:

type : Type
-----------
y : type

是否可以在 y 的类型归属期间或之前强制评估 type,以便 y 的类型为 Elem 1 [1, 2]

我的用例是我希望能够定义通用谓词 return 证明的正确命题术语,例如:

subset : List a -> List a -> Type
subset xs ys = (e : a) -> Elem e xs -> Elem e ys

thm_filter_subset : subset (filter p xs) xs

类型声明中以小写字母开头的名称是隐式绑定的,因此它将 'type' 视为类型参数。您可以给 'type' 一个以大写字母开头的新名称(按照惯例,这是大多数人在 Idris 中所做的),或者您可以使用它所在的模块(Main,此处)明确限定该名称。

Idris 曾经尝试猜测诸如 'type' 之类的名称是隐含的还是意指全局的,如此处所示。虽然有各种各样的巫术都涉及到正确的做法,所以它经常失败,所以它现在实现了这个更简单的规则。在这种情况下有点烦人,但替代行为通常更烦人(而且更难解释)。