我不明白eol的类型(例如)意味着什么:
eol :: (MonadParsec e s m, Token s ~ Char) => m String或者,更好的是,我不知道如何在Text.Megaparsec.Text而不是Text.Megaparsec.String中使用eol。
我一直试图使用学习如何使用Megaparsec (旧的)教程Parsec从真实的世界Haskell (我实际上开始阅读RWH教程,然后才发现兆赫秒存在)。我将第一个示例的代码重写为使用兆赫秒(见下文)。但我发现,当我试图将eol类型强制到Parser Text时,编译器会抛出错误:Couldn't match type ‘[Char]’ with ‘Text’,从中我得到的结果是,我不能在Text中使用eol,或者更可能的是,我不知道如何将eol声明中的Token s ~ Char上下文更改为使用Token Text。
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
module CSVParser (
module CSVParser
) where
import Foundation
import Data.Functor.Identity (Identity)
import Text.Megaparsec
import Text.Megaparsec.Text
import Data.Text
csvFile :: Parser [[Text]]
csvFile =
do result <- many line
eof
return result
line :: Parser [Text]
line =
do result <- cells
--eol :: Parser Text -- uncommenting this line results in a compilation error
eol
return result
cells :: Parser [Text]
cells =
do first <- cellContent
next <- remainingCells
return (first : next)
remainingCells =
(char ',' >> cells)
<|> return []
cellContent :: Parser Text
cellContent = fromList <$> many (noneOf [',','\n'])
parseCSV :: Text -> Either (ParseError (Token Text) Dec) [[Text]]
parseCSV = parse csvFile "(unknown)"发布于 2017-06-21 17:00:25
在类型上:
eol :: (MonadParsec e s m, Token s ~ Char) => m String~是一个类型相等约束,而MonadParsec和Token类型类是由Megaparsec定义的。它们大致可以解释如下:
MonadParsec e s m是一种断言,即类型m是一个一元解析器,它读取s类型的Stream,并使用e类型的ErrorComponent表示错误。Token s是从流s读取的令牌的底层类型。因此,完整的类型可以解释为:eol是一个具有“返回值”String的一元解析器,它解析令牌为Char的流。
对于你的问题,大部分都是可以忽略的。您遇到的问题是,eol作为解析的结果返回一个String值,而String不是Text,因此无论您多么努力地尝试,都不能使eol (类型为Parser String)成为Parser Text类型。
两种解决方案是忽略不需要的String返回值,或者,如果需要将其作为文本进行转换:
Data.Text.pack <$> eolhttps://stackoverflow.com/questions/44681410
复制相似问题