gpt4 book ai didi

Haskell Parsec 跳过所有未预定义的单词

转载 作者:行者123 更新时间:2023-12-02 16:52:36 25 4
gpt4 key购买 nike

学习使用 Parsec 库,这是作业的一部分。

编辑:欢迎使用其他库的建议,重点是解析。

我想要的是从任何句子中提取所有带有大写字母的单词和四个指南针方向。示例:“比利时完全位于荷兰南部。”应该找到并返回“比利时南荷兰”。

我不知道如何忽略(吃掉)任何不是罗盘方向的输入。我一直在寻找类似的东西

'many (not compassDirection >> space)'

但是 g(h)oogle 没有帮助我。

以下代码显然卡在“many”函数上。

readExpr :: String -> String
readExpr input = case parse (parseLine) "" input of
Left err -> "No match: " ++ show err
Right val -> "Found: " ++ showVal val

parseLine :: Parser GraphValue
parseLine = do
x <- parseCountry
space
many ( some (noneOf " ") >> space )
y <- parseCompass
space
many ( some (noneOf " ") >> space )
z <- parseCountry
return $ Direction [x,y,z]

compassDirection :: Parser String
compassDirection = string "north" <|>
string "south" <|>
string "east" <|>
string "west"

parseCountry :: Parser GraphValue
parseCountry = do
c <- upper
x <- many (lower)
return $ Country (c:x)

parseCompass :: Parser GraphValue
parseCompass = do
x <- compassDirection
return $ Compass x

最佳答案

我不会详细说明,因为这是家庭作业,OP 说“重要的是解析”。

<小时/>

我解决这个问题的方法:

  • 对输入进行标记。将其分解为文字;这将使真正的解析步骤不必担心标记定义(即“%#@[ 是单词的一部分吗?”)或空格。这可以像 words 一样简单,或者您可以使用 Parsec 进行标记化。然后您将获得[Token](如果您愿意,也可以使用[String])。

  • 罗盘方向的解析器。您已经有了这个(干得好),但如果输入是 [String] 而不是 String,则必须稍作修改。

  • 以大写字母开头的单词的解析器。

  • 用于其他所有内容的解析器,只要它看到不是指南针方向或以大写字母开头的单词的标记,就会成功。

  • 一个解析器,可以处理任何标记,但可以区分好东西和坏东西,可能使用代数数据类型。

  • 可处理大量标记的解析器

希望这一点是清楚的,但又不会清楚;例如,您仍然需要担心何时丢弃垃圾。基本思想是将问题分解为许多小子问题,解决子问题,然后将这些解决方案粘合在一起。

关于Haskell Parsec 跳过所有未预定义的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com