如何说服类型检查器 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"函数的类型gf
2) 如何在不包含额外类型变量的情况下解决这个问题?

f : (SomeInterface e) => e l -> c
f x {l} = ?hole_f_1
  where
    g : e l
    g = ?hole_g

这是否符合您的要求?我相信由于 e l 是一种类型,您仍然可以获得有关 l 部分的隐式信息。