【问题标题】:Calculate simple math expression pass as a command line argument计算简单的数学表达式传递作为命令行参数
【发布时间】:2020-10-07 10:02:19
【问题描述】:

我是 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


    【解决方案1】:

    Haskell 没有 array[index] 语法。它确实有list!!index 语法(这根本不是特殊的语法,!! 只是前奏中定义的一个中缀函数)。请注意,Haskell 索引是从 0 开始的,与 Bash 不同,第零个参数不是命令名称本身,因此您可能需要索引 0 和 1。

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

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

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

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

    或者像我们喜欢的那样,用$ 代替括号:

        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 2
    5.00

    当然,这不会允许您执行./math "5 * 8" 之类的操作,因为您无法解析*。为此,基于read 的东西会很尴尬;我建议您查看解析器组合器库,周围有很多教程; this one 似乎又好又简单。

    【讨论】:

    • 感谢您的信息!但我有一个小错误,我不知道为什么我有这个错误printf: bad formatting char 'f'
    • 是的,我选择了错误的类型来阅读:你想要浮点数,而不是整数。固定。
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 2017-05-06
    • 2015-07-14
    • 1970-01-01
    • 2015-04-11
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多