Я новичок в 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]
1
Jonathan Gómez 7 Окт 2020 в 13:02

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; Я предлагаю вам ознакомиться с библиотеками комбинаторов синтаксического анализатора, существует множество руководств; этот кажется простым и приятным.

6
leftaroundabout 7 Окт 2020 в 10:53