我是 Haskell 和 Megaparsec 库的初学者。在解析一行文本时,我需要解析行中剩余的文本,直到行尾(LF 或 CRLF)。我的想法是使用some
,noneOf
但即使在 GHCi 中测试后也无法编译代码,如下所示:
λ> import Data.Text (Text, pack)
λ> import Data.Void
λ> import Text.Megaparsec as M
λ> import Text.Megaparsec.Char as M
λ> import qualified Text.Megaparsec.Char.Lexer as L
λ> type Parser = Parsec Void Text
λ>
λ> parse (some (noneOf "\r\n")) "" (pack "a line of text\r\n")
Right "a line of text"
λ> parse (some (noneOf "\r\n")) "" (pack "a line of text\n")
Right "a line of text"
所以解析器(some (noneOf "\r\n"))
编译成功并返回我所期望的:“一行文本”,不包括行尾字符。但是,我无法在源文件中编译以下代码
pLineValue :: Parser Text
pLineValue = do
str <- (some (noneOf "\r\n"))
return (pack str)
编译器给出以下错误:
• Ambiguous type variable ‘f0’ arising from a use of ‘noneOf’
prevents the constraint ‘(Foldable f0)’ from being solved.
Probable fix: use a type annotation to specify what ‘f0’ should be.
These potential instances exist:
instance Foldable (Either a) -- Defined in ‘Data.Foldable’
instance Foldable Maybe -- Defined in ‘Data.Foldable’
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
...plus one other
...plus 37 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the first argument of ‘some’, namely ‘(noneOf "\r\n")’
In a stmt of a 'do' block: str <- (some (noneOf "\r\n"))
In the expression:
do str <- (some (noneOf "\r\n"))
return (pack str)
|
78 | str <- (some (noneOf "\r\n"))
| ^^^^^^^^^^^^^
我究竟做错了什么?源文件中的正确语法是什么?还是有更好的方法来解析剩余的文本,但不包括 LF 或 CRLF 结尾?我会很感激任何帮助,谢谢。