[英]Idris parser combinator GADT
我目前正在Idris中实现一个简单的解析器组合器库,以学习该语言并总体上更好地理解类型系统,但是在围绕如何声明和使用GADT方面遇到一些麻烦。 我试图配制的样子(在Haskell)解析器数据类型: type Parser a = String -> [(a,String)]
,从该纸张。 基本上,类型是一个接受字符串并返回列表的函数。
在伊德里斯,我有:
data Parser : Type -> Type where
fail : a -> (String -> [])
pass : a -> (String -> [(a,String)])
其中fail
实例是一个总是失败的解析器(即-将是一个始终返回空列表的函数),而pass
实例是一个消耗了一些符号的解析器。 将上述内容加载到解释器时,我收到一个错误,即List elem
和预期的Type
之间存在类型不匹配。 但是,当我用:t String -> List Type
String- :t String -> List Type
在repl中检查解析器的返回类型时,我得到Type
,看起来应该可以工作。
如果有人能很好地解释为什么此数据声明不起作用,或者是表示解析器数据类型的更好替代方法,我将不胜感激。
在定义数据类型解析器时,第一行表示此类型接受一个类型并返回一个类型,在这种情况下,它接受一个a
并返回一个Parser a
。
因此,您的构造函数应返回Parser a
。
类似于List
接受a
并返回List a
的List a
。
您当前在构造函数中返回的内容不是Parser
类型-很容易看到,因为Parser
一词在右侧没有出现。
除此之外,我不确定您如何最好地表示这一点。 但是,已经有一些用Idris编写的解析器库了,看一下这些库是否有帮助? 例如,看一下此库列表,首先提到的是解析器: -Idris库
在Haskell,
type Parser a = String -> [(a,String)]
不会创建新的类型,它只是类型的同义词。 您可以在Idris中执行类似的操作
Parser : Type -> Type
Parser a = String -> List (a, String)
然后将帮助程序定义定义为返回Parser a
的简单函数:
fail : Parser a
fail = const []
pass : a -> Parser a
pass x = \s => [(x, s)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.