我不明白什麼呢的類型(例如)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