我不明白什么呢的类型(例如)eol
平均:百万秒差距:如何声明`eol`的解析文本和类型不[字符]
eol :: (MonadParsec e s m, Token s ~ Char) => m String
,或者更好,我不明白如何使用EOL Text.Megaparsec.Text
而不是Text.Megaparsec.String
。
我一直在尝试使用学习如何使用Megaparsec遵循从真实世界Haskell Parsec(旧)教程(我实际上开始阅读RWH教程之前发现Megaparsec存在)。我重写了code of the first example以使用Megaparsec(见下文)。但我发现,当我试图强制eol
的类型为Parser Text
时,编译器会抛出错误:Couldn't match type ‘[Char]’ with ‘Text’
,我从中收集的是,我不能使用eol
与Text
,或者更可能的是,我不知道如何更改Token s ~ Char
上下文从eol
声明中使用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)"
你为什么写'EOL ::分析器Text'当你忽略它的返回价值呢? –
嗯,我这样做是因为我想知道如何改变它的类型。我想改变它的类型,因为库中的许多其他函数具有相同的类型声明,例如'lowerChar ::(MonadParsec esm,Token s〜Char)=> m Char',我可能不想忽略它的返回值但将它约束为“文本”(为此我可以从'List <$> lowerChar',但看起来很丑陋,我想我可以直接改变类型,但我不知道或理解,如何)。主要是我的问题是'(MonadParsec e s m,Token s〜Char)=> m Char'。 – helq