gpt4 book ai didi

haskell - Parsec 返回 [Char] 而不是 Text

转载 作者:行者123 更新时间:2023-12-03 23:14:45 25 4
gpt4 key购买 nike

我正在尝试为自定义文件格式创建解析器。在我使用的格式中,一些字段有一个结束标记,如下所示:

<SOL>
<DATE>0517
<YEAR>86
</SOL>

我正在尝试获取 </ 之间的值和 >并将其用作更大解析器的一部分。

我想出了下面的代码。问题是,解析器返回 [Char]而不是 Text .我可以打包每个 Char通过做fmap pack $ return r得到一个文本值,但我希望类型推断可以让我不必这样做。有人可以提示我为什么要回来吗 [Char]而不是 Text ,以及我怎样才能回来 Text无需手动打包值?

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.Text
import Text.Parsec
import Text.Parsec.Text

-- |A closing tag is on its own line and is a "</" followed by some uppercase characters
-- followed by some '>'
closingTag = do
_ <- char '\n'
r <- between (string "</") (char '>') (many upper)
return r

最佳答案

string 具有类型

string :: Stream s m Char => String -> ParsecT s u m String

(有关文档,请参阅 here)

因此,返回一个 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

此外,在这个例子中这并不重要,但您可能希望导入 Text 限定,像 pack 这样的名称在许多不同的模块中使用。


正如 Ørjan Johansen 正确指出的那样,string 实际上不是这里的问题,many upper 才是。但同样的原则也适用。

关于haskell - Parsec 返回 [Char] 而不是 Text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23503702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com