【发布时间】:2016-07-06 13:58:40
【问题描述】:
我目前正致力于在 Idris 中实现一个简单的解析器组合器库,以学习该语言并更好地理解一般类型系统,但在理解如何声明和使用 GADT 时遇到了一些麻烦。我试图制定的解析器数据类型看起来像(在 Haskell 中):type Parser a = String -> [(a,String)],来自this 论文。基本上,类型是一个接受字符串并返回列表的函数。
在伊德里斯我有:
data Parser : Type -> Type where
fail : a -> (String -> [])
pass : a -> (String -> [(a,String)])
fail 实例是一个总是失败的解析器(即 - 将是一个总是返回空列表的函数),pass 实例是一个消耗一些符号的解析器。将上述内容加载到解释器中时,我收到一个错误,指出List elem 和预期类型Type 之间存在类型不匹配。但是,当我使用:t String -> List Type 检查repl 中解析器的返回类型时,我得到Type,这看起来应该可以工作。
如果有人能很好地解释为什么此数据声明不起作用,或者表示解析器数据类型的更好替代方法,我将不胜感激。
【问题讨论】: