- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我被 attoparsec 困住了,我无法返回关于它是“嵌入式类型”的值。
我试图解析一个文件:
type
value
type
value
...
例如:
0 -- code for a string value
hello
70 -- code for an int value
10
0
world
20 -- code for a double value
5.20
我当前的数据类型是:
data KeyValue = forall a. (Typeable a, Show a, Eq a) => KeyValue (Int, a)
instance Eq KeyValue where -- as I need to test equality
KeyValue (code1, value1) == KeyValue (code2, value2) =
code1 == code2 && case cast value2 of
Just value2' -> value1 == value2
Nohing -> False
我的解析器看起来像:
parser :: Parser [KeyValue]
parser = many' (keyValue <* endOfLine)
keyValue :: Parser KeyValue
keyValue = do
key <- decimal <* endOfLine
value <- case key of
0 -> takeLine
20 -> double
70 -> decimal
_ -> takeLine
return $ KeyValue (key, value)
takeLine :: Parser Text
takeLine = takeTill isEndOfLine
但是 GHC 提示说:
Couldn't match type Double with Text
Expected type: Parser Text Text
Actual type: Parser Double
In the expression: double
In a case alternative: 20 -> double
我理解原因,但不知道如何解决这个问题!
目前,我使用 ExistantialQuantification
pragma 和 Data.Typeable
,但我不确定解决方案是否需要“如此复杂” 有那个问题吗?
最佳答案
创建一个总和类型并让您的解析器返回它,例如:
data SumType = Str String | Int Int | Double Double
keyvalue :: Parser SumType
keyvalue = ...
现在 keyvalue
可以以 return (Str "foo")
结束,以指示字符串已被解析或以 return (Int 23)
等表示一个 int 已经被解析。
例如像这样的东西:
keyValue = do
key <- decimal <* endOfLine
case key of
20 -> do d <- parseDouble; return (Double d)
70 -> do i <- parseInt; return (Int i)
...
关于haskell - attoparsec 如何返回不同类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31685685/
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我
我被 attoparsec 困住了,我无法返回关于它是“嵌入式类型”的值。 我试图解析一个文件: type value type value ... 例如: 0 -- code for a strin
我正在使用 Attoparsec,并且我想在整个解析任务中跟踪用户状态值。 我熟悉 Parsec 的一元函数 getState、putState 和修改状态,但我似乎无法在 Attoparsec 中找
我正在尝试在第 5 列中使用 JSON 制作适合导入到 mongoDB 的大型 TSV 文件。特别是我想将顶级和仅顶级关键字段更改为 _id。这是我目前所拥有的,它似乎有效但速度很慢: {-# LAN
假设有一个数据结构表示一个文本,里面有评论。 data TWC = T Text TWC -- text | C Text TWC -- comment | E -- end deri
我正在使用据说默认回溯的 Attoparsec。但是,以下行: parseOnly (string "foo" *> many1 anyChar manyTill1 p e = (:) p m
我正在尝试用一个函数来扩充 Haskell 的 Attoparsec 解析器库 takeRegex :: Regex -> Parser ByteString 使用其中一种正则表达式实现。 (动机:好
是否有一些“简单”的方法(例如我在 Attoparsec 或其他一些库中缺少的东西)将定义的 Attoparsec 解析器从 ByteString 解析为从 Text 解析的解析器? 例如我有: im
Attoparsec提供了至少消耗一个字符的函数 takeWhile1。 但是,skipWhile 没有类似的东西。如何实现这个函数skipWhile1? 注意:这个问题故意表现出没有研究工作,因为它
我正在将一些使用 Parsec 的功能 Haskell 代码转换为使用 Attoparsec,希望获得更好的性能。我已经进行了更改并且所有内容都已编译,但我的解析器无法正常工作。 我正在解析一个由各种
我的类型: data Test = Test { a :: Int, b :: Int } deriving (Show) 我的解析器: testParser :: Parser Test tes
背景 我使用 attoparsec 编写了一个日志文件解析器。我所有较小的解析器都成功了,组成的最终解析器也是如此。我已通过 tests 确认了这一点。但我在使用解析的流执行操作时遇到了困难。 我尝试
我一直在编写 attoparsec 解析器,并且一直在寻找一种模式,我想将解析器转换为递归解析器(将它们与 monad 绑定(bind) >>= 运算符递归地组合)。 所以我创建了一个函数将解析器转换
我一直在编写一个 attoparsec 解析器来解析 Uniform Code for Units of Measure 的内容。调用 。它被定义为某个类(该类包括所有数字 0-9)中不以数字结尾的最
Attoparsec提供了至少消耗一个字符的函数 takeWhile1。 但是,skipWhile 没有类似的东西。如何实现这个函数skipWhile1? 注意:这个问题故意表现出没有研究工作,因为它
我正在使用 attoparsec 的内置解析器“double”和“number”来解析浮点值,我从不同的解析器得到不同的结果。 >parse number "8.918605790440055e-2"
attoparsec 0.72 有这个功能,但在后来的版本中似乎消失了: stringTransform :: (ByteString -> ByteString) -> ByteString ->
我有一个简单的基于 attoparsec 的 pdf parser .它工作正常,直到与 iteratee 一起使用。 当输入的大小超过缓冲区大小时。 import qualified Data.By
我使用 attoparsec 编写了以下解析代码: data Test = Test { a :: Int, b :: Int } deriving (Show) testParser :
我是一名优秀的程序员,十分优秀!