Haskell Parsec返回[Char]而不是文本
我正在尝试为自定义文件格式创建解析器。在我使用的格式中,某些字段有一个结束标记,如下所示:Haskell Parsec返回[Char]而不是文本,haskell,type-inference,parsec,Haskell,Type Inference,Parsec,我正在尝试为自定义文件格式创建解析器。在我使用的格式中,某些字段有一个结束标记,如下所示: <SOL> <DATE>0517 <YEAR>86 </SOL> 字符串具有 string :: Stream s m Char => String -> ParsecT s u m String (有关文档,请参阅) 因此,收回字符串正是应该发生的事情 类型推断不会改变类型,它只会推断它们String是一种具体类型,因此无法为其推断Text
<SOL>
<DATE>0517
<YEAR>86
</SOL>
字符串
具有
string :: Stream s m Char => String -> ParsecT s u m String
(有关文档,请参阅)
因此,收回字符串
正是应该发生的事情
类型推断不会改变类型,它只会推断它们String
是一种具体类型,因此无法为其推断Text
如果您在一些地方需要它,您可以做的是编写一个函数
text :: Stream s m Char => String -> ParsecT s u m Text
text = fmap pack . string
甚至
string' :: (IsString a, Stream s m Char) => String -> ParsecT s u m a
string' = fmap fromString . string
此外,在本例中这并不重要,但您可能希望导入文本
限定名称,例如pack
在许多不同的模块中使用
正如厄尔詹·约翰森正确地指出的那样,
string
实际上不是这里的问题,many upper
才是问题所在。同样的原理也适用。这里得到[Char]
的原因是upper
解析Char
,而many
将其转换为[Char]
。我会按照以下思路编写我自己的combinator:
manyPacked = fmap pack . many
您可能会使用类型级编程和类型类等,根据预期返回类型自动选择
many
和manyPack
,但我认为这不值得。(它可能看起来有点像Scala的CanBuiltFrom)。我认为many upper
在这里比string
更相关,因为between
只返回其第三个解析器参数的结果。我看到many upper
的类型是ParsecT s u m[Char]
我的印象是[Char]
值可以用作文本
而无需手动打包,如果启用了OverloadedStrings扩展?OverloadedStrings是语法扩展,而不是类型系统扩展。特别是,它读取IsString类中的字符串文字(引号中的内容)。OverloadedStrings扩展在这里没有帮助,因为它只影响程序源代码中的字符串文字,而不影响程序在运行时创建的字符串。@rjanJohansen哦,你说得对。我不知怎么搞混了这两者之间的争论顺序。
manyPacked = fmap pack . many