分析Haskell中的字符(―;―;)时出错

分析Haskell中的字符(―;―;)时出错,haskell,attoparsec,Haskell,Attoparsec,我正在编写一个解析器,用ATOPASSERC解析大块的英语文本。到目前为止,一切都很好,除了解析这个char“――”。我知道这仅仅是两个破折号--“”。奇怪的是,解析器在下面的代码中捕捉到了它: wordSeparator :: Parser () wordSeparator = many1 (space <|> satisfy (inClass "――?!,:")) >> pure () wordSeparator::Parser() wordSeparator=m

我正在编写一个解析器,用ATOPASSERC解析大块的英语文本。到目前为止,一切都很好,除了解析这个char
“――”
。我知道这仅仅是两个破折号--“”。奇怪的是,解析器在下面的代码中捕捉到了它:

wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass "――?!,:")) >> pure () 
wordSeparator::Parser()
wordSeparator=many1(空格满足(包括类“――?!,:”)>>pure()
但在这种情况下并非如此:

specialChars = ['――', '?', '!', ',', ':']
wordSeparator :: Parser ()
wordSeparator = many1 (space <|> satisfy (inClass specialChars)) >> pure ()
specialChars=['――','?','!',',':']
wordSeparator::解析器()
wordSeparator=many1(空格满足(包括类特殊字符))>>pure()

<>我之所以使用列表<代码>特殊字符是因为我有很多字符需要考虑,并且我将它应用到多个案例中。对于输入,请考虑:
“我是――沃尔特·惠特曼.”
,输出应该是
{“我”、“是”、“沃尔特”、“惠特曼”。}
我相信这主要是因为
“――沃尔特·惠特曼”不是字符?我该如何解决这个问题

A
Char
是一个字符,句号
――是两个字符,所以它是两个字符。您可以在一个
字符串中放入任意多个
Char
,但您肯定不能在一个
Char
中放入两个
Char

由于
满足
一次考虑单个字符,因此如果需要将两个字符的序列作为单个单元进行解析,那么这可能不是您想要的。
inClass
函数只对字符生成一个谓词(
inClass
部分应用于一个参数会生成一个类型为
Char->Bool
)的函数),因此
inClass”――与
inClass['―','―]
相同,这与
inClass['―]]
因为重复项是不相关的。那对你没有多大帮助

考虑使用
string
而不是
inClass
,或者与之结合使用,因为它是为处理字符序列而设计的。例如,类似这样的内容可能更适合您的需要:

wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()
wordSeparator::Parser()
wordSeparator=many1(空格字符串“――满足(包括类”!,:”)>>pure()

A
Char
是一个字符,句号
――是两个字符,所以它是两个字符。您可以在一个
字符串中放入任意多个
Char
,但您肯定不能在一个
Char
中放入两个
Char

由于
满足
一次考虑单个字符,因此如果需要将两个字符的序列作为单个单元进行解析,那么这可能不是您想要的。
inClass
函数只对字符生成一个谓词(
inClass
部分应用于一个参数会生成一个类型为
Char->Bool
)的函数),因此
inClass”――与
inClass['―','―]
相同,这与
inClass['―]]
因为重复项是不相关的。那对你没有多大帮助

考虑使用
string
而不是
inClass
,或者与之结合使用,因为它是为处理字符序列而设计的。例如,类似这样的内容可能更适合您的需要:

wordSeparator :: Parser ()
wordSeparator = many1 (space <|> string "――" <|> satisfy (inClass "?!,:")) >> pure ()
wordSeparator::Parser()
wordSeparator=many1(空格字符串“――满足(包括类”!,:”)>>pure()

对不起,我应该指出我一直在使用数据。文本和字符串“-”将导致错误。但是,我通过使用另一个inClass修复了它。您可以看到我更新的帖子。@ceeks可以很好地处理
Data.Text
。您可能需要使用
OverloadedStrings
Data.Text.pack
Data.Attoparsec.Text.string
的参数生成
Text
值,但请相信我,这确实是您想要的函数。谢谢您的建议,我会这样做的。但是纯粹出于好奇,如果我使用另一个sulfit(inclass“-”)会有什么样的含义/后果呢?@ceeks正如我在回答中提到的,
inclass“――将
精确地等同于
inclass['―]
,因此您的解析器将字符串
视为两个不同的分隔符,它将解析单个
作为分隔符。我假设这不是您想要的,因为如果是,您只需编写
inClass”―“
,然后就可以使用它了。很抱歉,我应该指出我一直在使用数据。文本和字符串“-”将导致错误。但是,我通过使用另一个inClass修复了它。您可以看到我更新的帖子。@ceeks可以很好地处理
Data.Text
。您可能需要使用
OverloadedStrings
Data.Text.pack
Data.Attoparsec.Text.string
的参数生成
Text
值,但请相信我,这确实是您想要的函数。谢谢您的建议,我会这样做的。但是纯粹出于好奇,如果我使用另一个sulfit(inclass“-”)会有什么样的含义/后果呢?@ceeks正如我在回答中提到的,
inclass“――将
精确地等同于
inclass['―]
,因此您的解析器将字符串
视为两个不同的分隔符,它将解析单个
作为分隔符。我假设这不是您想要的,因为如果是,您只需编写
inClass”―“
并完成它。