我在文件 A 中具有以下接口定义:
interface Loader (c : Type -> Type) r where
LoadType : Type
idToFilepath : (id : String) -> String
loadFilepath : (x : Var) -> (filepath : String) -> ST c r [x ::: LoadType]
load : (x : Var) -> (id : String) -> ST c r [x ::: LoadType]
load {c} {r} x id = loadFilepath x (idToFilepath {c} {r} id)
如果我从{c} {r}
的定义中删除load
和对idToFilepath
的调用,它将不会进行类型检查,并显示以下消息:
Can't find implementation for Loader c r
否则,对文件 A 进行类型检查。这很奇怪,但是我已经看到显式传递隐式内容有时会有所帮助。
问题在于尝试在文件 B 中实现此接口。即使文件 A 中的Loader
接口的定义可以进行类型检查,但是一旦尝试在文件 B 中进行最小化实现,它也不会进行类型检查。这是供参考的代码:
interface Draw (m : Type -> Type) where
-- ...
Draw m => Loader m Texture where
LoadType {m} = ?check
它给出以下奇怪的错误消息:
When checking left hand side of Resources.Main.m, Texture implementation of Resources.Loader, method load:
c is not an implicit argument of Resources.Main.m, Texture implementation of Resources.Loader, method load
鉴于文件 A 已类型检查并且在 B 中未引入任何实质性代码,这毫无意义。