Задачи по проекту "Калькулятор выражений"

Нужно решить одну задачу на компьютере. Номер задачи определяется как остаток от деления номера студента по журналу на 3 (задачи нумеруются с нуля.)

Все 3 задачи требуют модификации проекта "Калькулятор выражений", реализованного на языке Haskell. Исходные файлы проекта содержатся в архиве Calc.zip: файл Calc.hs содержит непосредственно код калькулятора выражений, реализованный в виде модуля Calc — в терминологии языка Haskell это "чистый" (pure) код. Файл exprCalc.hs является лишь интерфейсом ввода-вывода (функция main) и содержит "грязный" (tainted) код. Выполняемая программа "exprCalc" (или "exprCalc.exe" в MS Windows) компилируется с помощью команды

    ghc --make exprCalc.hs
(или просто командой make в Linux или OS-X — Makefile предусмотрен). Изменения в проект следует вносить только в файл Calc.hs, содержащий модуль Calc (при компиляции этот модуль автоматически компилируется и подключается в строке "import Calc" файла exprCalc.hs).

Список задач

  1. В предложенном варианте проекта стандартные функции могут иметь только 1 аргумент (sin, cos, sqrt, exp, log, atan). Изменить проект так, чтобы можно было добавлять функции от произвольного (ненулевого) числа аргументов, например, добавить функции pow, atan2, gcd, зависящие от двух аргументов, и функцию powmod, зависящую от трех аргументов (последние две функции оперируют с целыми числами, т.е. перед вычислениями приводят значения аргументов к целому типу, отбрасывая дробную часть).
  2. Добавить операцию возведения в степень, которая может обозначаться либо двумя звездочками ** (как в языке Python), либо символом "крышки" ^ (как принято у математиков, поскольку этот символ используется для показателей степени и верхних индексов в TeX). Эта операция, в отличие от остальных арифметических операций, должна выполняться справа налево (например, 2^2^3 = 256, а не 64) и иметь приоритет, более высокий, чем у остальных арифметических операций (например, 2*3^2 = 18, а не 36).
  3. Добавить возможность использования констант pi и e в выражениях. Например,
        Enter an expression:
        sin(pi/6)
        = 0.5
    
        Enter an expression:
        e
        = 2.718281828459045
    
        Enter an expression:
        log(e*e)
        = 2.0