Úloha Calc

Vaším dalším úkolem je napsat funkci calc :: (Fractional a) => String -> Either String a, která jako vstup očekává řetězec s výpočtem a jako výstup vrátí buď výsledek, pokud je vstup v pořádku, nebo chybovou hlášku, pokud se nepodaří vypočet provést. Jedná se tedy o jednoduchý textový kalkulátor. [20 bodů]

Řetězec s výpočtem bude pracovat s čísly (celými i desetinnými), uzávorkováním pomocí kulatých závorek a může obsahovat tyto operace:

V tomto zápisu vyjadřují znaky a a b čísla nebo nějaké podvýrazy, které mohou být uzavřeny v závorkách.

Poznámky

Příklady

$ calc "1"
Right 1.0
$ calc "1 + 1"
Right 2.0
$ calc "1.2 + 1"
Right 2.2
$ calc "1 + 1 * 2"
Right 3.0
$ calc "(1 + 1) * 2"
Right 4.0
$ calc "(-1) + 1"
Right 0.0
$ calc "-1 + 1"
Right 0.0
$ calc "(-2) * (-2)"
Right 4.0
$ calc "-2 * -2"
Right 4.0
$ calc "12 / 5"
Right 2.0
$ calc "12.0 / 5"
Right 2.4
$ calc "(10 + 2) / 5"
Right 2.0
$ calc "(10.0 + 2) / 5"
Right 2.4
$ calc "1 +"
Left "Syntax error."
$ calc "(1 + 1"
Left "Syntax error."
$ calc "10 / 0"
Left "Division by zero."
$ calc "10.0 / 0"
Left "Division by zero."
$ calc "10 / (1 - 1)"
Left "Division by zero."

Vypracování úlohy

Řešení úlohy uložte do souboru calc.hs a nahrajte do čtvrté odevzdávárny. Nejzazší termín pro vypracování je 24. 4. 2011, 23:59, později již není možné soubor s řešením odevzdat pomocí IS.

← IB016