Idris隐式错误消息“ ...不是...的隐式参数”

时间:2019-03-14 21:54:21

标签: idris

我在文件 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 中未引入任何实质性代码,这毫无意义。

0 个答案:

没有答案