Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Parsec返回[Char]而不是文本_Haskell_Type Inference_Parsec - Fatal编程技术网

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