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:
a + b — sčítání;a - b — odčítání;a * b — násobení;a / b — dělení.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.
/ bude dělit celočíselně, pokud jako argumenty dostane v obou případech celé číslo (nebo výraz, který celé číslo vrací). Podobně se budou chovat i ostatní operátory, tedy budou vracet celé číslo pouze jestliže budou oba argumenty celá čísla.$ 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."
Ř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.