如何解决“无法将类型'b'与ConcreteType匹配”的问题?

时间:2019-07-25 17:05:37

标签: haskell

体系结构如下:用户生成一个Intent,然后由系统捕获。解析程序找到可以解决此意图的适当函数。有一个索引将Intent映射到在这些Intent中提到其功能的模块。基本思想是,模块接受一个实体,然后生成另一个实体。

我尝试了ExistentialTypes,但我认为我还没有足够的专业知识来与它们一起工作,所以我想知道是否有更简单的方法。

一个实体看起来像这样。

data Entity a = Entity {...}

data DirectionEntity = DirectionEntity {...}

有很多实体。

处理程序如下:

handler :: Entity NavigationEntity -> IO (Entity DirectionEntity)

我想要一些有关类型级别的信息。 一切都很好,直到我想在一个地方拥有一个包含所有这些处理程序的单一数据结构。基本上,我希望有一个类似的功能:

solveIntent :: Intent -> Entity a -> IO (Entity b)
solveIntent intent entity = do
  index <- mkIndex
  let m = searchModule index intent
  run m entity

这是标题中的问题:我无法匹配类型:

Expected type: Entity a -> IO (Entity b)
Actual type: Entity NavigationEntity -> IO (Entity DirectionEntity)

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

Intent这样的数据类型不会公开任何类型信息。 Intent的{​​{1}}的类型与NavigationEntity -> DirectionEntity的{​​{1}}的类型相同。因此,Intent的结果类型不能基于DirectionEntity -> NavigationEntity进行更改,这是有问题的,因为这就是重点。

退一步,您有searchModule的大量集合。您希望能够选择两个Intentexists a b. Entity a -> IO (Entity b)Type)并在您的集合中搜索匹配的函数。这是a的工作:您需要定义一个类型来容纳每个b,再加上Typeableexists a b. Entity a -> IO (Entity b)的证据{{1} 1}}应该为您要搜索的两种类型提供Typeable证据。您不需要a或其他任何东西。您只需要要搜索的模块类型。最简单的集合类型就是b

lookupModule

应该给你类似的东西

Typeable

如果您的收藏集确实很大,则可能要使用Intent。因为我们使用的是不安全的操作,所以变得更加麻烦,但是界面仍然是安全的。这应该有自己的模块,用于访问控制。

[]