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' 之类的名称是隐含的还是意指全局的,如此处所示。虽然有各种各样的巫术都涉及到正确的做法,所以它经常失败,所以它现在实现了这个更简单的规则。在这种情况下有点烦人,但替代行为通常更烦人(而且更难解释)。
考虑以下片段:
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' 之类的名称是隐含的还是意指全局的,如此处所示。虽然有各种各样的巫术都涉及到正确的做法,所以它经常失败,所以它现在实现了这个更简单的规则。在这种情况下有点烦人,但替代行为通常更烦人(而且更难解释)。