Haskell-编写一个小解析器

福曼

我想为足球比分写一个小解析器。

例如,输入"0:2"应解析为Just (Score 0 2)如果有类似的"3:3"事情应该给我"Nothing"其他所有的东西也应该给我"Nothing"

data Score = Score Int Int
deriving (Eq,Show,Ord)


runParsec :: Parser a -> String -> Maybe a
runParsec parser input = case runP parser () "" input of
Left  _ -> Nothing
Right a -> Just a

我给runParsec作为参数的解析器看起来像这样:

parseScore :: Parser Score
parseScore str1 = case str1 of
    "x:y" && (x /= y)   -> Right Score x y
    Otherwise           -> Left x

我知道,parseScore的此代码无法正常工作。因为我无法使用“ x:y”之类的字符串来进行模式匹配。但是我该如何解决这个问题呢?

runParsec parseScore "0:2" 应该给我 Just (Score 0 2)

我很感谢提示。

谢谢!

自己

只需Parser为您的类型写一个适当的代码,然后过滤掉不需要的内容即可:

import Control.Applicative ((<$>))
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Char

data Score = Score Int Int deriving (Show)

parseScore :: Parser Score
parseScore = do
  a <- integer
  char ':'
  b <- integer
  return $ Score a b

integer :: Parser Int
integer = read <$> many1 digit

runParsec :: String -> Maybe Score
runParsec input = case parse parseScore "" input of
  Left e -> Nothing
  Right e -> case e of
    Score 0 2 -> Just e
    _ -> Nothing

演示ghci

λ> runParsec "0:2"
Just (Score 0 2)
λ> runParsec "3:3"
Nothing
λ> runParsec "3:4"
Nothing

如果我想接受所有分数1:0、0:4等,该怎么办?一切,但没有像“ jirjgir”这样的随机输入,也没有像“ 2:2”或“ 5:5”这样的均等分数

只需更改您的过滤条件:

runParsec :: String -> Maybe Score
runParsec input = case parse parseScore "" input of
  Left e -> Nothing
  Right e -> case e of
    Score x y -> if x == y
                 then Nothing
                 else Just e

演示:

λ> runParsec "1:0"
Just (Score 1 0)
λ> runParsec "0:4"
Just (Score 0 4)
λ> runParsec "2:2"
Nothing
λ> runParsec "jiraf"
Nothing

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Haskell-将解析器与另一个

来自分类Dev

从头开始在Haskell中编写解析器

来自分类Dev

用 Haskell 为 Person 编写解析器

来自分类Dev

Haskell的级联解析器

来自分类Dev

在Haskell中编写一个foldMap

来自分类Dev

在Haskell(Parsec)中链接两个解析器

来自分类Dev

Haskell解析器组合器

来自分类Dev

编写一个简单的语法解析器

来自分类Dev

解析器(Haskell)的更好应用实例

来自分类Dev

在Haskell中合并解析器

来自分类Dev

使用Parsec的Haskell HTML解析器

来自分类Dev

用解析器组合器解析Haskell本身

来自分类Dev

如何使用Haskell解析器解析任意列表?

来自分类Dev

Haskell:运算符解析器一直在未定义而不是输入

来自分类Dev

真实世界的Haskell的CSV解析器实现

来自分类Dev

如何在EOF停止Haskell Parsec解析器

来自分类Dev

Haskell中使用GHCi的功能解析器示例

来自分类Dev

Haskell:Turtle:命令行解析器

来自分类Dev

具有拼写检查功能的haskell解析器

来自分类Dev

如何通过单词列表制作Haskell解析器?

来自分类Dev

使用monad进行简单的Haskell解析器

来自分类Dev

Haskell Aeson - Gloss - JSON 实例解析器:颜色

来自分类Dev

如何为散置元素列表编写一个parsec解析器?

来自分类Dev

如何用“ win_flex bison”编写一个纯解析器和可重入扫描器?

来自分类Dev

Haskell - 编写一个在 Trie 结构中搜索和计数的函数

来自分类Dev

如何编写一个变异解析器来更改一个对象的一个或多个特定值?

来自分类Dev

如何编写一个boost :: spirit :: qi解析器来做什么?在正则表达式中?

来自分类Dev

另一个解析器中的C字符串解析器

来自分类Dev

Haskell 解析中 CPS 与非 CPS 解析器的堆使用情况

Related 相关文章

热门标签

归档