Como reduzir a duplicação de código ao lidar com tipos de soma recursiva

Atualmente, estou trabalhando em um intérprete simples para uma linguagem de programação e tenho um tipo de dados como este: data Expr = Variable String | Number Int | Add [Expr] | Sub Expr Expr E eu tenho muitas funções que fazem coisas simples como: -- Substitute a value for a...