【问题标题】:Issue with overloading strings in Haskell using attoparsec使用 attoparsec 在 Haskell 中重载字符串的问题
【发布时间】:2018-05-03 22:49:48
【问题描述】:

首先,我想让您知道我对 Haskell 还很陌生,我正在尝试了解解析器如何在 Haskell 中工作。所以我基本上是在尝试从http://www.gutenberg.org/files/57071/57071-0.txt 解析这本电子书并分析文本。比如输出英语单词、句子和段落等的数量。 这是我的代码:

{-# LANGUAGE OverloadedStrings #-}

import Control.Exception (catch, SomeException)
import System.Environment (getArgs)
import Data.Attoparsec.Text
import Data.Char
import Control.Applicative ((<*>), (*>), (<$>), (<|>), pure)


data Prose = Prose {
  word :: String
} deriving Show

prose :: Parser Prose
prose = do
  word <- many' $ satisfy isAlphaNum
  return $ Prose word

main :: IO()
main = do
  input <- readFile "small.txt"
  print $ parse prose input

这是我的错误信息:

  • 无法将类型“[Char]”与“Data.Text.Internal.Text”匹配;
    预期类型:Data.Text.Internal.Text;
    实际类型:字符串
  • 在‘parse’的第二个参数中,即‘input’ 在‘($)’的第二个参数中,即‘parse prose input’ 在“do”块的 stmt 中:print $ parse prose input

我已经使用“OverloadedStrings”来尝试解决这个问题,但它似乎不起作用。此外,任何有关 attoparsec 入门示例或教程的指导都会非常有帮助!

【问题讨论】:

    标签: parsing haskell attoparsec


    【解决方案1】:

    -XOverloadedStrings 只是将 string literals 的类型从String 更改为更通用的IsString a =&gt; a(可以与StringTextByteString 等统一)。在您的代码中,只有一个文字:文件名"small.txt"

    但是文件名总是String好吧,FilePath,但这只是String的同义词。 (即使Data.Text.IO 函数也将文件名作为普通旧列表字符串。)因此,重载的字符串文字实际上在这里根本没有区别。

    但是解析器处理的不是文件名而是文件contents,所以你需要做的是使用以Text获取这个内容的IO例程。

    import qualified Data.Text.IO as Txt
    
    main :: IO()
    main = do
      input <- Txt.readFile "small.txt"
      print $ parse prose input
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2021-10-18
      • 2013-04-24
      相关资源
      最近更新 更多