我以最终无标签样式反序列化磁盘中的数据结构。IE
class SYM repl where
a :: repl
include :: FilePath -> repl
myParser :: SYM r => Parser r
我正在解析的语言包含指令。
我使用attoparsec
的不是单子变压器,所以我不能简单地提供一个类型Loader = FilePath -> IO (Maybe Text)
。
我可以用以下SYM
实例编写一个解释器,它解决了一个包含问题。
instance SYM r => SYM (Loader -> IO (Either String r)) where
include path loader =
maybe (Left "cannot load") (parseOnly myParser) <$> loader path
不幸的是,包含在包含文件中的内容没有得到解决。当然我可以解决它们两次以解决下一层。但是,如果我想对每个可能的级别都这样做,那会导致无限类型。
现在我预加载所有包含(在 a 中HashMap
)并绑定它们,所以我可以将 a 传递FilePath -> Maybe Text
给解析器并在那里解析包含,但这显然不是最佳的。(并且 includeSYM
不再是其中的一部分。)
我的问题是,最终无标签样式如何处理该问题?
编辑:我在 lpaste 上发布了一个完整的例子:http: //lpaste.net/105182