首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >megaparsec:如何声明“not”的类型来解析文本而不是[Char]

megaparsec:如何声明“not”的类型来解析文本而不是[Char]
EN

Stack Overflow用户
提问于 2017-06-21 16:19:08
回答 1查看 395关注 0票数 1

我不明白eol的类型(例如)意味着什么:

代码语言:javascript
复制
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

代码语言:javascript
复制
{-# 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)"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 17:00:25

在类型上:

代码语言:javascript
复制
eol :: (MonadParsec e s m, Token s ~ Char) => m String

~是一个类型相等约束,而MonadParsecToken类型类是由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返回值,或者,如果需要将其作为文本进行转换:

代码语言:javascript
复制
Data.Text.pack <$> eol
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44681410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档