【发布时间】:2020-11-22 18:05:47
【问题描述】:
我是 Haskell 的初学者,我有点不知道用什么来使这个程序正常工作。我要做的是得到一个这样的字符串:“a+(b/c)”
问题还说我不能使用以下单词:“words, putStr, putStrLn, readLn, print"
首先我设法将字母与符号分开,然后将它们组合在一起:
isLetter :: String -> String
isLetter [] = []
isLetter (a:as) | a `elem` "abcdefghijklmnopqrstuvwxyz" = a : isLetter as
| otherwise = isLetter as
isOperator :: String -> String
isOperator [] = []
isOperator (a:as) | a `elem` "+-*/^" = a : isOperator as
| otherwise = isOperator as
onp :: String -> String
onp [] = []
onp str = isLetter str ++ isOperator str
问题在于它只是将操作符放在字母之后,而不考虑它实际应该遵循的顺序。
所以我对如何转换它进行了一些研究,我认为我应该首先检查哪个是运算符,哪个是字母,并且根据将中缀转换为后缀的规则,我会将它们放在一起另一个字符串。所以我创建了两个函数来判断它是字母还是运算符。
一团糟,不过是这样的:
isLetHelp :: Char -> Bool
isLetHelp ch | ch `elem` "abcdefghijklmnopqrstuvwxyz" = True
| otherwise = False
isOpHelp :: Char -> Bool
isOpHelp a | a `elem` "()+-*/^" = True
| otherwise = False
isOperator :: String -> String
isOperator [] = []
isOperator (a:as) | a `elem` "+-*/^" = a : isOperator as
| otherwise = isOperator as
getSymbol :: String -> String
getSymbol [] = []
getSymbol (a:as) | isOpHelp == True = isOperator
| isLetHelp == True = a : getSymbol as
最后一个函数“getSymbol”将负责获取符号并以正确的方式组织它们,但我不知道该怎么做。
【问题讨论】:
-
执行此技术的规范方法是使用Shunting-yard algorithm。也许维基百科页面可以为您指明正确的方向。所呈现的伪代码是命令式的(因此更适合 Python 之类的东西),但在 Haskell 中确实更容易,因为它是一种非常以解析器为中心的技术。
-
@SilvioMayolo 哦,我读过一些关于它的东西。我会看看。谢谢!
标签: list algorithm haskell postfix-notation infix-notation