Во-первых, вы должны подумать о том, как объявить уравнение (или полиномы) для этой цели.Например, вы можете определить
data Polynomial = Polynomial [Polynomial]
| Sum Polynomial Polynomial
| Ln Polynomial
| Log10 Polynomial Polynomial
| Var String -- a named Variable
| ...
. Для простоты работы с полиномами вы можете создать экземпляры для вашего типа данных Polynomial для Eq, Ord, Num и т. Д., Чтобы вы могли работать с полиномом так же, как счисла.
instance Num Polynomial where
a + b = ...
Для создания этих функций вы можете легко использовать Pattern Matching:
(Sum a b) + (Sum c d) = Sum (Sum a b) (Sum c d)
Для уравнения вы можете просто использовать кортежи и создать для него новый тип:
type Equation = (Polynomial, Polynomial)
Для решения этой проблемы можно использовать такую функцию:
solve :: Equation -> String -> Polynomial
... где String - это имя переменной.
Решить, чем нужноделать настоящую работу.Опять же, для этого Pattern Matching можно было бы использовать для первых шагов:
solve ((Sum (Var a) b, e) x -- solves polynomials of type a + b = c + d
| a == x = Sum e (negate b)
| ...
Конечно, это очень просто, и вы можете сделать это намного умнее, сократив число возможных случаев, используя нормализацию, котораяНапример, объединяет «a + a + a» в «3 * a».