如何说服类型检查器 where 子句中的类型与顶层类型相匹配?
How to convince the typechecker that the types in the where clause match the toplevel type?
我试图让类型检查器相信 where 子句中指定的类型与顶级函数的一种类型相匹配。
例如:
interface SomeInterface (e: Type -> Type) where
label : e l -> l
f : (SomeInterface e) => e l -> c
f x = ?hole_f
where
g : e l
g = ?hole_g
?hole_g
的类型应该是 e l
,但是类型检查器无法将 g : e l
中的 l
类型与 l
中的类型相匹配顶层 f : (SomeInterface e) => e l -> c
类型。所以根据类型检查器 ?hole_g
的类型是 e l1
解决此问题的一种方法是将 l
作为单独的类型变量包含在顶层函数 f
中,如下所示:
f : (SomeInterface e) => e l -> l -> c
f x _ = ?hole_f
where
g : e l
g = ?hole_g
请注意,顶层函数中的 l
由于 _
而被完全忽略。但是类型检查器现在以某种方式确信 ?hole_g
的类型变量是 e l
,就像顶层类型一样。
我的两个问题是:
1) 为什么typechecker不能"link"函数的类型g
到f
?
2) 如何在不包含额外类型变量的情况下解决这个问题?
f : (SomeInterface e) => e l -> c
f x {l} = ?hole_f_1
where
g : e l
g = ?hole_g
这是否符合您的要求?我相信由于 e l
是一种类型,您仍然可以获得有关 l
部分的隐式信息。
我试图让类型检查器相信 where 子句中指定的类型与顶级函数的一种类型相匹配。
例如:
interface SomeInterface (e: Type -> Type) where
label : e l -> l
f : (SomeInterface e) => e l -> c
f x = ?hole_f
where
g : e l
g = ?hole_g
?hole_g
的类型应该是 e l
,但是类型检查器无法将 g : e l
中的 l
类型与 l
中的类型相匹配顶层 f : (SomeInterface e) => e l -> c
类型。所以根据类型检查器 ?hole_g
的类型是 e l1
解决此问题的一种方法是将 l
作为单独的类型变量包含在顶层函数 f
中,如下所示:
f : (SomeInterface e) => e l -> l -> c
f x _ = ?hole_f
where
g : e l
g = ?hole_g
请注意,顶层函数中的 l
由于 _
而被完全忽略。但是类型检查器现在以某种方式确信 ?hole_g
的类型变量是 e l
,就像顶层类型一样。
我的两个问题是:
1) 为什么typechecker不能"link"函数的类型g
到f
?
2) 如何在不包含额外类型变量的情况下解决这个问题?
f : (SomeInterface e) => e l -> c
f x {l} = ?hole_f_1
where
g : e l
g = ?hole_g
这是否符合您的要求?我相信由于 e l
是一种类型,您仍然可以获得有关 l
部分的隐式信息。