计算作为命令行参数的简单数学表达式过程



我是Haskell的新手,我迷路了。我试图解析一个数学表达式,但真的不知道Haskell编程是如何工作的。所以我想写的是一个程序来解析一个简单的数学表达式。我正在寻找如何通过辩论来解决问题的想法。

命令行可能看起来像:./math "3 + 2"./math "5 * 8"

我的代码如下:

import System.Environment (getArgs)
import Text.Printf
main :: IO ()
main = do
args <- getArgs
printf "%.2f" args[1] + args[2]

Haskell没有array[index]语法。它确实有list!!index语法(这根本不是特别的语法,!!只是序言中定义的中缀函数(。请注意,Haskell索引是基于0的,与Bash不同,第零个参数不是命令名本身,因此您可能需要索引01

此外,在Haskell函数中,应用程序的绑定比任何运算符都要紧密。所以,如果你要写

printf "%.2f" args!!0 + args!!1

它会解析为((printf "%.2f" args)!!0) + (args!!1),这显然是不对的。你需要明确你想要的优先级:

printf "%.2f" (args!!0 + args!!1)

或者我们喜欢用$代替parens:

printf "%.2f" $ args!!0 + args!!1

这仍然是不对的,因为参数以字符串的形式出现,但加法应该对数字执行。为此,您需要读取数字;我建议你单独做:

import Text.Read (readMaybe)
main = do
args <- getArgs
let a, b :: Double
Just a = readMaybe $ args!!0
Just b = readMaybe $ args!!1
printf "%.2f" $ a + b
$runhaskell Argsmath.hs 3 25.00

当然,这将不允许您执行类似./math "5 * 8"的操作,因为您无法解析*。因此,基于read的东西会很尴尬;我建议你看看解析器组合子库,那里有很多教程;这个看起来很简单。

最新更新