繁体   English   中英

Idris解析器组合器GADT

[英]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 aList 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM